题目说明:
输入两个年份x,y,输出这两个年份内的所有对称日
输入:
输入两个正整数x和y,输入保证x<y。
输出:
两个年份里的所有对称日。
解题思路:
1.定义函数判断平闰年;
2.定义函数判断回文数;
3.输入要找的年份区间;
4.判断平闰年后判断月份,注意二月的特例;
5.挨个判断是否为回文数;
6.区间内年,月,日累加,判断是否为对称日;
7.按要求输出;
#include<stdio.h>
int pingnian(int year)//定义函数判断平闰年
{
if(year%4==0&&year%100!=0||year%400==0){
return 0;
}else{
return 1;
}
}
int huiwen(int x)//定义函数判断回文数
{
int a[8],i=0;
while(x!=0){
a[i]=x%10;
x/=10;
i++;
}
int flag=0,j;
for(i=0,j=7;i<8,j>=0;i++,j--){
if(a[i]==a[j]){
flag=1;
}else{
flag=0;
break;
}
}//正序数等于倒序数为回文数
return flag;
}
int main()
{
int m,n,cnt=0;
printf("计算m年到n年的对称日,输入m n:");
scanf("%d %d",&m,&n);//输入要找的区间
int year,month,day;
for(year=m;year<=n;year++){//年累加
for(month=1;month<=12;month++){//月累加
if(pingnian(year)){//调用函数判断平闰年
if(month==2){
for(day=1;day<=28;day++){//二月特例
if(huiwen(year*10000+month*100+day)){//调用函数判断回文数
printf("%d ",year*10000+month*100+day);//输出回文数
cnt++;
if(cnt%5==0&&cnt!=0){//控制换行
printf("\n");
}
}
}
}else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){//均为31天的月份
for(day=1;day<=31;day++){
if(huiwen(year*10000+month*100+day)){//判断回文
printf("%d ",year*10000+month*100+day);//输出回文数
cnt++;
if(cnt%5==0&&cnt!=0){//控制换行
printf("\n");
}
}
}
}else{
for(day=1;day<=30;day++){//均为30天的月份
if(huiwen(year*10000+month*100+day)){//调函数判断回文
printf("%d ",year*10000+month*100+day);//输出回文数
cnt++;
if(cnt%5==0&&cnt!=0){//控制换行
printf("\n");
}
}
}
}
}else{//判断闰年
if(month==2){//二月特例
for(day=1;day<=29;day++){
if(huiwen(year*10000+month*100+day)){//调用函数判断回文数
printf("%d ",year*10000+month*100+day);
cnt++;
if(cnt%5==0&&cnt!=0){
printf("\n");
}
}
}
}else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){
for(day=1;day<=31;day++){
if(huiwen(year*10000+month*100+day)){
printf("%d ",year*10000+month*100+day);
cnt++;
if(cnt%5==0&&cnt!=0){
printf("\n");
}
}
}
}else{
for(day=1;day<=30;day++){
if(huiwen(year*10000+month*100+day)){
printf("%d ",year*10000+month*100+day);
cnt++;
if(cnt%5==0&&cnt!=0){
printf("\n");
}
}
}
}
}
}
}
return 0;
}