[plain]
/* 程序頭部注釋開始(為避免提交博文中遇到的問題,將用於表明注釋的斜槓刪除了)
* 程序的版權和版本聲明部分
* All rights reserved.
* 文件名稱: txt.c
* 作 者: liuyongshui
* 問 題: 2011年11月02日是一個回文日:2011 1102,我還記得我和2011級的同學在這一天一起做這個題的時候!
請列出近80還有多少個回文日
* 完成日期: 2013 年4 月14日
* 版 本 號: V1.0
*/
#include <stdio.h>
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;
}
/* 程序頭部注釋開始(為避免提交博文中遇到的問題,將用於表明注釋的斜槓刪除了)
* 程序的版權和版本聲明部分
* All rights reserved.
* 文件名稱: txt.c
* 作 者: liuyongshui
* 問 題: 2011年11月02日是一個回文日:2011 1102,我還記得我和2011級的同學在這一天一起做這個題的時候!
請列出近80還有多少個回文日
* 完成日期: 2013 年4 月14日
* 版 本 號: V1.0
*/
#include <stdio.h>
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;
}