求经过的闰年数
编写函数,求从公元 y 1年开始到公元 y 2年之间经过的闰年总数 n。按照现行历法(格里高利历):四年一闰,百年不闰,四百年再闰。即:年数是 4 的倍数且不是 100 的倍数,或者年数是 400 的倍数,则为闰年,否则为平年。
注:为简化程序设计,作以下限制
年数一律为正整数(即不考虑公元前的情况);
不考虑历法演变过程(即假定从一开始就一直使用现行的历法)。
我的代码:
#include
int main()
{
int x,y,n=0;
scanf("%d%d",&x,&y);
n=(y-x+1)/400*97;
for(int i=x%400;i<=y%400;i++)
{
if((i%4==0&&i%100!=0)||i%400==0)
n++;
}
printf("%d",n);
return 0;
}
这里用求余是因为怕运行会超时,但是还是有两个测试点是错的:
不用枚举,可以用数学方法直接算y1到y2之间闰年的个数
#include<stdio.h>
int main()
{
int x,y,z;
int a, b;
scanf("%d%d", &a, &b);
x = b / 4 - (a - 1) / 4; //4的倍数的年
y = b / 100 - (a - 1) / 100; //100倍数的年
z = b / 400 - (a - 1) / 400; //400倍数的年
printf("%d", x - y + z);
}
用一个isleap函数来判断闰年
#include<stdio.h>
int isleap(int y)
{
return y%4==0&&y%100!=0||y%400==0;
}
int main()
{
int y1,y2,n=0;
scanf("%d %d",&y1,&y2);
while(y1<=y2)
if(isleap(y1++))
n++;
printf("%d",n);
return 0;
}
把把模于400去掉,保留模4和100试一试
@yyl1025 的方法:举个例子:输入:2 400后取余为零不能进入循环。
改进代码:
#include<stdio.h>
int main()
{
int x,y,n=0;
scanf("%d%d",&x,&y);
n=(y-x+1)/400*97;
x%=400;y%=400;
if(y<x)
y+=400;
for(int i=x;i<=y;i++)
{
if((i%4==0&&i%100!=0)||i%400==0)
n++;
}
printf("%d",n);
return 0;
}