【C语言及程序设计】项目1-39-6:回文日
问题描述:2011年11月02日是一个回文日:2011 1102。请列出本世纪还有多少个回文日。
1 int main() 2 { 3 int dyear(2011), dmonth(11), dday(2), fyear, eyear, c1(0), c2(0), c3(0); 4 int r_fyear, r_eyear, m1, m2; 5 6 //枚举 7 for (dyear = 2000; dyear < 3000; dyear++) 8 for (dday = 1; dday < 31; dday++) 9 for (dmonth = 1; dmonth <= 12; dmonth++) 10 { 11 12 //筛选合理的年月日数值 13 switch (dmonth) 14 { 15 16 case 4: 17 case 6: 18 case 9: 19 case 11: c1 = (dday <= 30); break; 20 21 case 1: 22 case 3: 23 case 5: 24 case 7: 25 case 8: 26 case 10: 27 case 12: c2 = (dday <= 31); break; 28 29 case 2: c3 = ( 30 ((dyear % 4 == 0 && dyear % 100 != 0) || dyear % 400 == 0) 31 && 32 (dday <= 29) 33 ) 34 || 35 ( 36 (!((dyear % 4 == 0 && dyear % 100 != 0) || dyear % 400 == 0)) 37 && 38 (dday <= 28) 39 ); 40 41 default:break; 42 } 43 44 r_fyear = 0; 45 r_eyear = 0; 46 47 if (c1 + c2 + c3 > 0) 48 { 49 //将年数值拆成两段,利用反序数模块与日月数值分别进行比较 50 fyear = dyear / 100; 51 eyear = dyear % 100; 52 53 m1 = 0; 54 m2 = 0; 55 56 while (fyear > 0) 57 { 58 r_fyear = r_fyear * 10 + fyear % 10; 59 fyear /= 10; 60 } 61 62 while (eyear > 0) 63 { 64 r_eyear = r_eyear * 10 + eyear % 10; 65 eyear /= 10; 66 } 67 } 68 69 if (r_fyear == dday && r_eyear == dmonth) 70 { 71 printf("%d.%d.%d\n", dyear, dmonth, dday); 72 } 73 74 } 75 76 return 0; 77 }
感想:
练习了循环枚举、switch语句筛选、逻辑运算、反序数模块。
2018.6.8 发现c1, c2 ,c3 没有初始化;
=