一位与num2从最后一位往前比较,若不等返回0
{
return 0;
}
}
return 1;
}
/* 程序头部注释开始(为避免提交博文中遇到的问题,将用于表明注释的斜杠删除了)
* 程序的版权和版本声明部分
* All rights reserved.
* 文件名称: txt.c
* 作 者: liuyongshui
* 问 题: 2011年11月02日是一个回文日:2011 1102,我还记得我和2011级的同学在这一天一起做这个题的时候!
请列出近80还有多少个回文日
* 完成日期: 2013 年4 月14日
* 版 本 号: V1.0
*/
#include
const int Day[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int CheckYear(int year); //检测是否为闰年或平年
int CompareNum(int num1[], int num2[]); // 比较是否为回文日
int main()
{
int i;
int num=1; //计数
int sign=0; //标记
int flag;
int mark;
int j=0;
int l=0;
int m=0;
int n;
int year[4]={0};
int monthday[4]={0};
for(i=2011; i<=2091; i++) //近80年
{
flag=i; //此处的用flag替代i,因为下面flag=flag/10语句会改边flag,如果不替换,会出错的。
for(j=0; j<4; j++) //把年的每一位放入数组year
{
year[j]=flag%10;
flag=flag/10;
}
for(l=1; l<=12; l++)
{
mark=l; // 也是替代l
for(n=1; n<=Day[l]; n++)
{
m=0; //每执行一次,就把m赋为0
sign=0; //每执行一次,就把sign赋为1
if(n<10) // (n<10)
{
monthday[m++]=n;
monthday[m++]=0;
}
else //取第几天(>=10)的每一位(如 10 ,就取 1 和 0)
{
monthday[m++]=n%10; //取每一位
monthday[m]=n/10%10;
}
if(l==2 && CheckYear(i)) //若果是闰年1 且为二月 就加一。
{
monthday[0]+=1;
}
if(l<10) //取第几月(>=10)的每一位(如 10 ,就取 1 和 0)
{
m=2; //让从m=2开始赋值
monthday[m++]=l; //取每一位
monthday[m++]=0;
}
else // (n<10)
{
m=2; //让从m=2开始赋值
monthday[m++]=mark%10; //取每一位
monthday[m]=mark/10%10;
}
if(CompareNum(year, monthday)) // 比较是否为回文日,若是真
{
if(l==2 && CheckYear(i) ) //若果是闰年1 且为二月 就加一
{
sign=1; //是回文日sign赋为1
printf("第%d个 %5d %5d %5d 是回文日.", num++, i, l, n+1);
}
else
{
sign=1; //是回文日sign赋为1
printf("第%d个 %5d %5d %5d 是回文日.", num++, i, l, n);
}
}
if(sign==1) //若果为真,即有回文日
{
printf("\n");
}
}
}
}
return 0;
}
//函数申明
int CheckYear(int year)
{
if((year%100 !=0 && year%4 ==0) || (year%400 ==0)) //若符合条件,为闰年,返回1
{
return 1;
}
else
{
return 0;
}
}
int CompareNum(int num1[], int num2[])
{
int i;
int j=3;
for(i=0, j=3; i<4, j>=0; i++, j--)
{
if(num1[i]!=num2[j]) //num1从开始的每一位与num2从最后一位往前比较,若不等返回0
{
return 0;
}
}
return 1;
}
