这算是一道比较综合的题,首先要明白平年和闰年的区别,以及里面的规律
其次要理解日期增加的方式,算是暴力一天天加了,
以减小的日期向较大的靠近,日-》月-》年 不断充盈并变大的过程
收获到的知识有:
1.数组的组织方式
比方这个表格类比一个二维数组,它为a[2][6],里间单元以0开头,是不存在a[2][6]单元的
有时候,我们可以固定一个维度,例如a[0][],则又变为一个一位数组,可以用来筛选不同的数据
2.闰年概念的C语言化
四年一闰,百年不闰,四百年再闰
这句话用中文表示很容易,但你要用编程语言形容很难,因为里面的元素是有相互交叉的
例如2000里面4的倍数是包含100,400的,100的倍数是包含400的
我们要从大的范围入手先从4的倍数里去除100的倍数,再重新捡起100的倍数里不应该去掉的,即400
3.两个小技巧:
又遇到的:while(scanf("%d%d",&time1,&time2)!=EOF) 其本来意思理解为:输入的元素未到文档末尾,即scanf的值完全接收就跳出
筛选位值: / 可找高位,%可找低位,要中间位数可结合使用
#include<cstdio>
int month[13][2]={
{0,0}, {31,31}, {28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}
};
bool isLeap(int year){
return (year%4==0 && year%100!=0)||(year%400==0); // 四年一闰,百年不闰,四百年再闰
}
int main(){
int time1,y1,m1,d1;
int time2,y2,m2,d2;
while(scanf("%d%d",&time1,&time2)!=EOF){
if(time1>time2) { //输入的数据从大小上就能直观判断日期先后
int temp=time1;
time1=time2;
time2=temp;
}
y1=time1/10000,m1=time1%10000/100,d1=time1%100; //通过整除得前位,取余得后位
y2=time2/10000,m2=time2%10000/100,d2=time2%100;
int ans=1; // 相同的日期算一天
while(y1<y2||m1<m2||d1<d2){
d1++; //输入一定有效日期,++后为后面做铺垫
if(d1==month[m1][isLeap(y1)]+1) { //满月情况
m1++;
d1=1;
}
if(m1==13){ //满年情况
y1++;
m1=1;
}
ans++; //一天一天加
}
printf("%d\n",ans);
}
return 0;
}
浙公网安备 33010602011771号