求皇历算法,不要源码
求万年历算法,不要源码
能判断该日是星期几,此年闰年还是平年
------解决方案--------------------
上面所有的代码,求闰年的部分都是错误的!你们的程序当年份小于3200时是正确的,再往后就都错了。比如3200年实际上不是闰年,但你们的程序却显示是闰年。实际上真正求闰年的算法还是有点难度的,要从本质上理解才能实现。
在计算闰年时,你们只是把年份对4、100和400求模,根本不知道为什么是4、100、400这三个数,后面还有没有其他的数。其实4、100和400这三个数是人为定的,只是选这几个数更容易计算,当然也可以是其他的数,比如4、120......。而在400的后面还有其他的数。
我的程序只需要你指定前面的几个数(当然这个数要合理),然后会以最优的方法自动算出后面的所有求模的数,最后给出闰年的判断。
下面是我的程序。
能判断该日是星期几,此年闰年还是平年
------解决方案--------------------
上面所有的代码,求闰年的部分都是错误的!你们的程序当年份小于3200时是正确的,再往后就都错了。比如3200年实际上不是闰年,但你们的程序却显示是闰年。实际上真正求闰年的算法还是有点难度的,要从本质上理解才能实现。
在计算闰年时,你们只是把年份对4、100和400求模,根本不知道为什么是4、100、400这三个数,后面还有没有其他的数。其实4、100和400这三个数是人为定的,只是选这几个数更容易计算,当然也可以是其他的数,比如4、120......。而在400的后面还有其他的数。
我的程序只需要你指定前面的几个数(当然这个数要合理),然后会以最优的方法自动算出后面的所有求模的数,最后给出闰年的判断。
下面是我的程序。
- C/C++ code
#include <iostream> using namespace std; int leap_year_array(unsigned int *a, int n)//计算闰年的整除数组,要求a[0]必须为1 { const unsigned int one_day = 24*3600; int bias = 5*3600 + 48*60 + 46; for (int i=1; i<n; ++i) { if (a[i]==0)//若a[i]!=0则说明此项为用户设定的值 { a[i] = one_day/bias*a[i-1]; } bias = one_day - a[i]/a[i-1]*bias; if (bias < 0) { cout<<"the setting number is wrong!"<<endl; return i; } if (bias == 0) { return i+1; } } return n; } bool check_leap_year(unsigned int *a, int n, unsigned int year) { for (int i=1; i<n && !(year%a[i]); ++i); if (i%2==1) { return false; } else { return true; } } bool is_leap_year(unsigned int *a, int a_len, unsigned int year) { int array_len = leap_year_array(a, a_len); if (array_len >= a_len) { cout<<"the array's size is not large enough!"<<endl; return false; } else { if (check_leap_year(a, array_len, year)) { cout<<"is leap year!"<<endl; return true; } else { cout<<"is not leap year!"<<endl; return false; } } } int main() { unsigned int year = 3200; const int len = 10; unsigned int a[len] = {1,4,100,0,0,0,0,0,0,0};//此数组的第一位必须为1,其他位用户可以设定期望值,如果用户希望由电脑计算,可设为零。 is_leap_year(a, len, year); return 0; }