答案:8879
思路:遍历每一天,处理好天数和月数累加时超出本月和本年的月数和月数界限。
代码实现:
#include<stdio.h>
isLeapYear(int n) {
if(n%400==0||(n%4==0&&n%100!=0)) {
return 1;
}
return 0;
}
int main() {
int arr[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int year=2000,month=1,day=1,w=6;
int count=0;
while(!(year==2020&&month==10&&day==2)) {//遍历2000/1/1号之后所有的日期,直到2020/10/2号跳出循环
if(isLeapYear(year)) {//处理2月的日期
arr[2]=29;
} else {
arr[2]=28;
}
if(day==1||w==1) {//处理周一或一号
count++;
}
count++;
day++;//天数累加
w=(w+1)%7;//计算星期几
if(day>arr[month]) {//处理天数超过本月的界限,月数超过本年的界限
day=1;//天数初始化
month++;//月数递增
if(month>12) {//当月增加时,须判断是否超出本年的界限
month=1;//月数初始化
year++;//年数递增
}
}
}
printf("截至日期:%d/%d/%d ",year,month,day-1);
printf("%d\n",count);
return 0;
}
运行结果:
截至日期:2020/10/1 8879
--------------------------------
Process exited after 0.1675 seconds with return value 0
请按任意键继续. . .
因为题目所求的答案过于庞大,所以需要当你写完代码时,测试答案代码的正确性很重要,测试前十天的答案是否正确,比如测试2000年1月10日是否正确。
whlie循环条件改成如下:
while(!(year==2000&&month==1&&day==11)
结果:
截至日期:2000/1/10 13
--------------------------------
Process exited after 0.2088 seconds with return value 0
请按任意键继续. . .
如果答案是13,则程序可靠,输入题目要求的日期。
下面这个行代码是为了测试写的,如果这是一道程序题时,当你测试程序无误时须要再删掉,因为测试平台不要打印多余字符,可能会报错。
printf("截至日期:%d/%d/%d ",year,month,day-1);