已知日期,算改天是星期几?
我的思想是这样的:
以公元0年1月1日星期天为基准,算出要求的日期与该日期的天数差,然后再对7求模。
余数为0: 星期天
余数为1: 星期一
余数为2: 星期二
余数为3: 星期三
余数为4: 星期四
余数为5: 星期五
但是这个程序算出来的的星期数总会比当前星期数多1,麻烦各位帮我看看,谢谢。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
int leapyear(int year)
{
int flag = 0;
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
{
flag = 1;
}
return flag;
}
int tianshu(int year, int month, int day)
{
int thisYearFlag = 0;
int totalDay = 0;
int beforeYearDay = 0;
int thisYearDay = 0;
int i = 0;
for (i = 0; i < year; i++)
{
int yearFlag = leapyear(i);
if(1 == yearFlag)
{
beforeYearDay += 366;
}
else
{
beforeYearDay += 365;
}
}
switch (month - 1)
{
case 1:
thisYearDay = 31;
break;
case 2:
thisYearDay = 31 + 28;
break;
case 3:
thisYearDay = 31 + 31 + 28;
break;
case 4:
thisYearDay = 30 + 31 + 31 + 28;
break;
case 5:
thisYearDay = 31 + 30 + 31 + 31 + 28;
break;
case 6:
thisYearDay = 30 + 31 + 30 + 31 + 31 + 28;
break;
case 7:
thisYearDay = 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
case 8:
thisYearDay = 31 + 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
case 9:
thisYearDay = 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
case 10:
thisYearDay = 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
case 11:
thisYearDay = 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
case 12:
thisYearDay = 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31 + 28;
break;
default:
break;
}
thisYearDay += day;
thisYearFlag = leapyear(year);
if (1 == thisYearFlag)
{
if (month > 2)
{
thisYearDay += 1;
}
}
totalDay = beforeYearDay + thisYearDay;
return totalDay;
}
int main()
{
int year, month, day, week;
int totalDay = 0;
printf("请输入年份:");
scanf("%d", &year);
printf("请输入月份(1 - 12月):");
scanf("%d", &month);
while (month < 1 || month > 12)
{
printf("输入的月份错误,请重新输入:");
scanf("%d", &month);
}
printf("请输入日期:");
scanf("%d", &day);
while (day < 1 || day > 31)
{
printf("输入的日期错误,请重新输入:");
scanf("%d", &day);
}
totalDay = tianshu(year, month, day);
week = (totalDay - 1) % 7;
switch (week)
{
case 0:
printf("今天是星期日\n\n\n");
break;
case 1:
printf("今天是星期一\n\n\n");
break;
case 2:
printf("今天是星期二\n\n\n");
break;
case 3:
printf("今天是星期三\n\n\n");
break;
case 4:
printf("今天是星期四\n\n\n");
break;
case 5:
printf("今天是星期五\n\n\n");
break;
case 6:
printf("今天是星期六\n\n\n");
break;
}
system("pause");
return 0;
}
# include <stdio.h>
int is_leap(int year)
{
return ((year % 4 == 0) && (year % 100 != 0))
[解决办法]
(year % 400 == 0);
}
int days(int year, int month, int day)
{
const int days_of_month[2][12] = {
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, },
};
int total = 0;
int i;
for (i = 0; i < year; i++)
total += is_leap(i) ? 366 : 365;
for (i = 0; i < month - 1; i++)
total += days_of_month[is_leap(year)][i];
total += day - 1;
return total;
}
int main()
{
int year, month, day;
printf("input year, month and day: ");
scanf("%d%d%d", &year, &month, &day);
switch (days(year, month, day) % 7)
{
case 0:
printf("It is Sun.\n");
break;
case 1:
printf("It is Mon.\n");
break;
case 2:
printf("It is Tue.\n");
break;
case 3:
printf("It is Wed.\n");
break;
case 4:
printf("It is Thu.\n");
break;
case 5:
printf("It is Fri.\n");
break;
case 6:
printf("It is Sat.\n");
break;
}
return 0;
}