题目:很诱人的一个题目:2011年11月02日是一个回文日:2011 1102,我们刚刚度过!请列出近80年和近60年还有多少个回文日(假如我们能活到百岁,你和我的……)。注意:一年只有12个月。
2012年11月30日新发的程序:
#include <iostream> using namespace std; int main( ) { int year,month,day,y,anothery; bool is_cycle; int count=0; for(year = 2012; year < 2092; year++) { month=year%100; //month取到的是年的后两位 month = (month%10)*10 + month/10; //将后两位倒过来,确定月份 day=year/100; //day取到的是年的前两位 day=(day%10)*10+day/10; //将前两位倒过来,确定日期 is_cycle =false; switch(month) //12个月份,各自对应合法的日期范围 { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(day<=31) is_cycle =true; break; case 4: case 6: case 9: case 11: if(day<=30) is_cycle=true; break; case 2: if((year%4==0&&year%100!=0)||year%400==0) //闰年 { if(day<=29) is_cycle =true; } else if(day<=28) is_cycle =true; break; default: continue; //后两位倒过来根本构不成月份 } if(is_cycle) //能构成回文日 { y=year; anothery=year; while(y>0) { anothery=anothery*10+y%10; y=y/10; } cout<<anothery<<endl; count++; } } cout<<"共有 "<< count <<"个回文日。"<<endl; return 0; }
一楼质疑的程序
/* 程序头部注释开始
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院
* All rights reserved.
* 文件名称: cycledate.cpp
* 作 者: 贺利坚
* 完成日期: 2011 年11月9日
* 版本号: v1.0
* 对任务及求解方法的描述部分
* 输入描述:无
* 问题描述:很诱人的一个题目:2011年11月02日是一个回文日:2011 1102,我们刚刚度过!列出近80年还有多少个回文日
* 程序输出:
* 问题分析:在近80年中,年份确定后,将其从最低位开始倒着取出,每两位组成一个单位,分别对应月份和日期部分。
* 分别判断这些月份和日期的取值范围是否合乎要求,如果符合则输出……
* 程序头部的注释结束
*/
#include <iostream>
using namespace std;
int main( )
{
int year,month,day,y,anothery;
bool is_cycle;
int count=0;
for(year = 2012; year < 2092; year++)
{
y =year; //后面直接用year不行吗?
month=y;
y=y/10;
month = month*10 + y; //将后两位倒过来,确定月份
y=y/10;
day=y;
y=y/10;
day=day*10+y; //将前两位倒过来,确定日期
is_cycle =false;
switch(month) //12个月份,各自对应合法的日期范围
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: if(day<=31) is_cycle =true; break;
case 4:
case 6:
case 9:
case 11: if(day<=30) is_cycle=true; break;
case 2: if((year%4==0&&year0!=0)||year@0==0) //闰年
{
if(day<=29) is_cycle =true;
}
else
if(day<=28) is_cycle =true; break;
default: continue; //后两位倒过来根本构不成月份
}
if(is_cycle) //能构成回文日
{
y=year;
anothery=year;
while(y>0)
{
anothery=anothery*10+y;
y=y/10;
}
cout<<anothery<<endl;
count++;
}
}
cout<<"共有 "<< count <<"个回文日。"<<endl;
return 0;
}
运行结果
经验积累:
1. 各方面要考虑周详
2. 在for循环中,用于表示年份的year只能在year++处变化,程序中再要用年份值,用其他变量临时替换
3. 变量用有意义的名称,编程过程中不会将意思搞乱
上机感言:
1. 我在程序中使用的while, for, if, switch还是很规矩的,请体会
2. 突然意识到这是个练习程序结构的好题,我做一份给大家参考吧
3. 人生苦短,你还能过9个回文日,我能过7个,这样想想,20111102多么珍贵。