计算“回文数年月日”

来源:互联网 发布:网络维护58同城 编辑:程序博客网 时间:2024/06/06 20:40

国庆假期,一位亲戚在群里说:“今天是2017年10月2号,有没有发现今天很特别?:2017102,正着读反着读都是一样的。”我在称赞其有趣之余,也指出:日期应该是两位数,所以20171002并不是真正的回文数。然后我就写了以下程序,来计算公元元年到公元2999年之间所有的回文数年月日。代码如下:

#include <iostream>#include <cmath> using namespace std;int main(){int year[4] = {0}, month[2] = {0}, day[2] = {0};for(year[0] = 0; year[0] <= 2; year[0]++)for(year[1] = 0; year[1] <= 9; year[1]++)for(year[2] = 0; year[2] <= 9; year[2]++)for(year[3] = 0; year[3] <= 9; year[3]++)for(month[0] = 0; month[0] <= 1; month[0]++)for(month[1] = 0; month[1] <= 9; month[1]++)for(day[0] = 0; day[0] <= 3; day[0]++)for(day[1] = 0; day[1] <= 9; day[1]++){if( //回文数条件 ( year[0] == day[1] && year[1] == day[0] && year[2] == month[1] && year[3] == month[0] ) //以下直到最终if括号结束为年月日搜索区间,整个搜索区间条件,与回文数条件成逻辑与关系 //搜索公元元年到2999年之间 && ( ( year[0] <= 2 || ( ( year[0] == 0 && year[1] == 0 && year[2] == 0 && year[3] != 0 ) ) )//搜索月份为1月至12月之间 && ( ( (month[0] == 1 && month[1] == 0) || (month[0] == 1 && month[1] == 1) || (month[0] == 1 && month[1] == 2) ) || (month[0] == 0 && month[1] != 0) )//以下为搜索日期的区间 && (//搜索日期为 1号到 9号之间 ( day[0] == 0 && day[1] != 0 ) //搜索日期为 10号到 19号之间 || ( day[0] == 1 ) //搜索日期为 20号到 29号之间 //首先算除去 2月以外的月份的 20到 29号 || ( day[0] == 2 && ( ( month[0] == 0 && month[1] != 2 ) || ( month[0] == 1 && month[1] == 0 ) || ( month[0] == 1 && month[1] == 1 ) || ( month[0] == 1 && month[1] == 2 ) ) )//其中闰年的 2月算到 29号 || ( day[0] == 2 && ( month[0] == 0 && month[1] == 2 )&& ( ( ( year[0] * 1000 + year[1] * 100 + year[2] * 10 + year[3]) % 400 == 0 )|| ( ( ( year[0] * 1000 + year[1] * 100 + year[2] * 10 + year[3]) % 100 != 0 ) && ( ( year[0] * 1000 + year[1] * 100 + year[2] * 10 + year[3]) % 4 == 0 ) ) ) )//平年的 2月算到 28号 || ( day[0] == 2 && day[1] != 9 && ( month[0] == 0 && month[1] == 2 )&& ( ( ( ( year[0] * 1000 + year[1] * 100 + year[2] * 10 + year[3]) % 400 != 0 )&& ( ( year[0] * 1000 + year[1] * 100 + year[2] * 10 + year[3]) % 100 == 0 ) )|| ( ( ( year[0] * 1000 + year[1] * 100 + year[2] * 10 + year[3]) % 100 != 0 )&& ( ( year[0] * 1000 + year[1] * 100 + year[2] * 10 + year[3]) % 4 != 0 ) ) ) )//搜索日期为 30号(小月:4、 6、 9、 11月)|| ( ( day[0] == 3 && day[1] == 0 ) && ( ( month[0] == 0 && ( month[1] == 4 || month[1] == 6 || month[1] == 9 ) )|| ( month[0] == 1 && month[1] == 1 ) ) )//搜索日期为 31号(大月:1、 3、 5、 7、 8、 10、 12月)|| ( ( day[0] == 3 && day[1] == 1 )&& ( ( month[0] == 0 && ( month[1] == 1 || month[1] == 3 || month[1] == 5 || month[1] == 7 || month[1] == 8 ) )|| ( month[0] == 1 && ( month[1] == 0 || month[1] == 2 ) ) ) ) ) ))cout << year[0] << year[1] << year[2] << year[3] << month[0] << month[1] << day[0] << day[1] << endl;}return 0;}

计算结果为:

0101101001100110011111100120021001211210013003100140041001500510016006100170071001800810019009100201102002100120021111200220022002211220023003200240042002500520026006200270072002800820029009200311113003400430036006300390093010011001101001011011110110200201102112011030030110400401105005011060060110700701108008011090090111011011111001111111111111200211112112111130031111400411115005111160061111700711118008111190091112011021121001211211112112200221122112211230032112400421125005211260062112700721128008211290092113011031131001311321123113300331135005311370073113800831200110022010010220111102202002022021120220300302204004022050050220600602207007022080080220900902210110122110011221111112212002122121121221300312214004122150051221600612217007122180081221900912220110222210012222111122222002222221122222300322224004222250052222600622227007222280082222900922

可以看出,刚刚过去的有回文数性质的年月日是2011年11月2日,而下一次回文数年月日是2020年2月2日。

还可以看出:具有回文数性质的年月日,在公元二世纪、三世纪、十一世纪、十二世纪、十三世纪、十四世纪、二十一世纪、二十二世纪、二十三世纪,分布特别多。

原创粉丝点击