-1

所以让我解释一下:输入你得到:例如:5 7 1904 5 5 5 675876789 日,月,年,小时,分钟,秒和一些数字k。在你需要得到的输出:4.12.1925。20:38:14

仅仅因为闰年,我不断得到 5.12.1925 20:38:14 并且我的算法在那里中断。如果有人知道如何帮助我,我将在下面发布我的代码?

#include<stdio.h>
int main()
{
    int D, M, G, H, m, s;
    unsigned int k;
    unsigned int ks,km,kH,kG,kM,kD;
    scanf("%d %d %d %d %d %d",&D,&M,&G,&H,&m,&s);
    while(G<1900 || G>2015)
    {
        scanf("%d %d %d %d %d %d",&D,&M,&G,&H,&m,&s);
    }
    int month;
    scanf("%u",&k);
    if(M == 1)
    {
        month=31;
    }
    if(M == 2 && G%4==0 && G%100!=0 && G%400==0)
    {
        month=29;
    }
    if(M == 2 && G%4!=0 && G%100!=0 && G%400!=0)
    {
        month=28;
    }
    if(M == 3)
    {
        month=31;
    }
    if(M == 4)
    {
        month=30;
    }
    if(M == 5)
    {
        month=31;
    }
    if(M == 6)
    {
        month=30;
    }
    if(M == 7)
    {
        month=31;
    }
    if(M == 8)
    {
        month=31;
    }
    if(M == 9)
    {
        month=30;
    }
    if(M == 10)
    {
        month=31;
    }
    if(M == 11)
    {
        month=30;
    }
    if(M == 12)
    {
        month=31;
    }
    kG=k/31536000;
    G=G+kG;
    k=k-kG*31536000;
    kM=k/(86400*month);
    k=k-kM*86400*month;
    kD=k/86400;
    k=k-kD*86400;
    kH=k/3600;
    k=k-kH*3600;
    km=k/60;
    ks=k-km*60;
    s=s+ks;
    m=m+km;
    H=H+kH;
    M=M+kM;
    while(s>=60)
    {
        m++;
        s-=60;
    }
    while(m>=60)
    {
        H++;
        m-=60;
    }
    while(H>=24)
    {
        D++;
        H-=24;
    }
    while(D>month)
    {
        M++;
        D-=31;
    }
    while(M>12)
    {
        G++;
        M-=12;
    }
    printf("%d.%d.%4d. %02d:%02d:%02d",D,M,G,H,m,s);
    return 0;
}
4

3 回答 3

2

你真的应该使用一个像样的库来做到这一点。不仅有闰年,还有闰年。有夏令时,如果你问的是上世纪初的日期,这里和那里会有一些日历变化,你没有机会考虑到这些变化。

至少您需要知道日期的语言环境,因为夏令时因语言环境而异。

也就是说,您计算哪些月份是闰年的逻辑是完全错误的。您需要了解 && 和 || 之间的区别。尝试 G = 2016 和 M = 2:根本不会设置月份(对于月份中的日子来说这是一个误导性的变量名称)。

于 2015-10-25T13:09:55.417 回答
1

好像在这里,你每个月有 31 天:

while(D>month)
{
    M++;
    D-=31;
}

而且,与这个问题无关,您还应该检查闰年和 2000 年的规则(这是一个例外)。

于 2015-10-25T12:22:33.470 回答
-1

闰年条件

如果年份能被 100 整除,那么它必须能被 400 整除才能成为闰年;如果年份不能被 100 整除,则只有当年份能被 4 整除时,它才是闰年;

IE,

if ((((year%100==0) && (year%400==0)) || ((year%100!=0) && (year%4==0))

查找范围内的闰年的代码:

int leapyears(int start_year, int ending_year)
{
int k=0;
while (start_year<=ending year)
{
//&& operator have higher preference than ||
if (start_year%4==0 && start_year%100!=0 || start_year%400==0)
k++;
start_year++;
}
return k;
}
于 2015-10-25T12:55:01.263 回答