计算一天不工作的简单程序

时间:2014-08-10 18:30:40

标签: c date-arithmetic

我正在尝试编写一个简单的程序,输出给定日期的日期,使用1/1/0001作为星期六。我已经写了这个程序,但是已经过了大约4个小时才找到一些错误,这使得我的回答错了。正确的答案可以在这里找到。 http://www.timeanddate.com/date/durationresult.html?d1=1&m1=1&y1=1&d2=1&m2=1&y2=400&ti=on

以下是我的计划:

#include <stdio.h>
#include <string.h>

long long int leap_days, days;

long long int *no_leap_years(int day, int month, long long int year){
    leap_days = (year-1)/4;
    leap_days -= (year-1)/100;
    leap_days += (year-1)/400;

    int is_leap;

    if(!(year%400)){
        is_leap = 1;
    } else if(!(year%100)){
        is_leap = 0;
    } else if(!(year%4)){
        is_leap = 1;
    } else {
        is_leap = 0;
    }

    printf("Leap year - %d\n", is_leap);
    printf("Leap days - %lld\n", leap_days);
    if(is_leap){
        if(month>2) leap_days++;
        else if(month==2){
            if(day>28) leap_days++;
        }
    }
    printf("Leap days - %lld\n", leap_days);
    return &leap_days;
}

long long int *no_of_days(int day, int month, long long int year){
    long long int leap_days = *no_leap_years(day, month, year);
    days = leap_days + (365*(year-1));
    if(month>1) days+=31;
    if(month>2) days+=28;
    if(month>3) days+=31;
    if(month>4) days+=30;
    if(month>5) days+=31;
    if(month>6) days+=30;
    if(month>7) days+=31;
    if(month>8) days+=31;
    if(month>9) days+=30;
    if(month>10) days+=31;
    if(month>11) days+=30;
    days+=day;
    printf("total - %lld\n", days);
    return &days;
}

char *day_computer(int day, int month, long long int year){
    long long int days = *no_of_days(day, month, year);
    printf("total - %lld\n", days);
    days %= 7;
    printf("remain - %lld\n", days);
    if(days==1) return "Saturday";
    else if(days==2) return "Sunday";
    else if(days==3) return "Monday";
    else if(days==4) return "Tuesday";
    else if(days==5) return "Wednesday";
    else if(days==6) return "Thursday";
    else return "Friday";
}

int main()
{
   int  dd = 1;
   int mm = 1;
   long long int yy = 400;

   printf("%s\n", day_computer(dd, mm, yy));

   return 0;
}

根据该网站,从1/1/1到1/1/400的总天数应该是145,735天,但根据我的代码,它是145732.我找不到我错过的地方3天。请帮帮我。

您可以使用此在线编辑器编译我的程序。 http://www.compileonline.com/compile_c_online.php

1 个答案:

答案 0 :(得分:3)

在线日历程序是正确的;那么你的代码也是如此。问题在于您计算的特定时间段。

您的代码会针对闰年进行调整:每4年一次,除了几个世纪(不是)和四个世纪(再次 )。然而,两次调整都是一个世纪以来的一次&#34;在Julian Calendar中没有观察到:

  

朱利安改革延长了7个月,取代了闰月,每隔4年就会增加一个闰月,直至2月。

在公元前46年 - 1582年10月4日期间,您应该使用 Julian 计算闰年。对于那之后的日期&#34;截止日期&#34; ( 1582年10月15日),您可以使用 Gregorian (当前)计算。

如果没有对整个世纪的闰年进行2次调整,您将获得与在线日历相同的结果。