给定某天日期(年、月、日),求这天是本年度第几周星期几?该如何解决

给定某天日期(年、月、日),求这天是本年度第几周星期几?
给定某天日期(年、月、日),求这天是本年度第几周星期几?

主要是一个算法,给出算法的思想也行.

------解决方案--------------------
参考代码:
注意:下面的程序需要以命令行的格式运行,例如,把编绎好的可执行文件的名字为 filename,那要查看某2002/01/01就输入 filename 2002/02/01,要查看2002年1月份就输入filename 2002/01或filename2002/01/0。

/*** 万年历 ***/

/*** 命令行:
若查看某一天,例如 calen 2001/12/28
若查看某个月,例如 calen 2001/12/0 或 calen 2001/12
***/
/**************************************************
1. 以2000/01/01日为星期六为基准。
2. dy为该年 1月1号 到2000年1月1号的 " 星期差 "
3. dm为该月以前的月所引起的 " 星期差 "
4. m2为二月所引起的 " 星期差 "
**************************************************/

main(int x,char **date)
{
int year=0,month=0,day=0,week;
int d,i,dm,dy,m2;
char WEEK[9];
if (x==1)
{
printf ( "\n ERROR! you forgot to enter the date you want to view\n ");
exit (0);
}
i=0; d=-1;
while (date[1][i])
{
if ((date[1][i]== '/ '||date[1][i]== '. ')&&d==-1) { d=0; i++; continue; }
if ((date[1][i]== '/ '||date[1][i]== '. ')&&d==0) { d=1; i++; continue; }
if (d==-1) year=year*10+(date[1][i]- '0 ');
if (d==0) month=month*10+(date[1][i]- '0 ');
if (d==1) day=day*10+(date[1][i]- '0 ');
i++;
}
if (month <1||month> 12)
{ printf ( "\n ERROR! the entered MONTH is invalid\n "); exit (0); }
if (year==2000) { dy=0; m2=1; goto la_100; }
if (year> 2000) d=(year-1-2000)/4-(year-1-2000)/100+(year-1-2000)/400+1;
else d=(year-2000)/4-(year-2000)/100+(year-2000)/400;
dy=(year-2000)+d; /*** 该年 1月1号 到2000年1月1号的 " 星期差 " ***/
if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0))
m2=1; else m2=0; /*** 该年是否润 ***/



la_100: /**** la_100 ****/

/*** 该月以前的月所引起的 " 星期差 " ***/
switch (month)
{
case 1: dm=0; month=31; break; /*** month 在此存放该月天数 ***/
case 2: dm=3; month=d==1? 29:28; break;
case 3: dm=3+m2; month=31; break;
case 4: dm=6+m2; month=30; break;
case 5: dm=1+m2; month=31; break;
case 6: dm=4+m2; month=30; break;
case 7: dm=6+m2; month=31; break;
case 8: dm=2+m2; month=31; break;
case 9: dm=5+m2; month=30; break;
case 10: dm=m2; month=31; break;
case 11: dm=3+m2; month=30; break;
case 12: dm=5+m2; month=31; break;
}
if (day <0||day> month)
{ printf ( "\n ERROR! the entered DAY is invalid\n "); exit (0); }
week=(dy+dm+day-1+6)%7; if(week <0) week+=7;

if (day> 0) /*** 判断查看类型 ***/
{
switch (week)
{
case 0: strcpy (WEEK, "SUNDAY "); break;
case 1: strcpy (WEEK, "MONDAY "); break;
case 2: strcpy (WEEK, "TUESDAY "); break;
case 3: strcpy (WEEK, "WEDNESDAY "); break;
case 4: strcpy (WEEK, "THURSDAY "); break;
case 5: strcpy (WEEK, "FRIDAY "); break;
case 6: strcpy (WEEK, "SATURDAY "); break;
}
printf ( "\n this day is %s \( %d \)\n\n OK!\n ",WEEK,week);
}
else
{
week=++week%7;
printf ( "\n the calender of this month as following\n ");
printf ( "\n *********************************\n ");
printf ( " SUN MON TUE WEN THU FRI STA\n ");