C语言编程序求经历的闰年数

求经过的闰年数
编写函数,求从公元 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;
}

这里用求余是因为怕运行会超时,但是还是有两个测试点是错的:

img


希望有人改正一下。

不用枚举,可以用数学方法直接算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;
}