我正在尝试编写一个简单的程序,输出给定日期的日期,使用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
答案 0 :(得分:3)
在线日历程序是正确的;那么你的代码也是如此。问题在于您计算的特定时间段。
您的代码会针对闰年进行调整:每4年一次,除了几个世纪(不是)和四个世纪(再次 )。然而,两次调整都是一个世纪以来的一次&#34;在Julian Calendar中没有观察到:
朱利安改革延长了7个月,取代了闰月,每隔4年就会增加一个闰月,直至2月。
在公元前46年 - 1582年10月4日期间,您应该使用 Julian 计算闰年。对于那之后的日期&#34;截止日期&#34; ( 1582年10月15日),您可以使用 Gregorian (当前)计算。
如果没有对整个世纪的闰年进行2次调整,您将获得与在线日历相同的结果。