**题目完整的文字记不下来了,大概是以下意思。
回文整数,年月日的8位数字,首尾反转后,仍然与原日期相同。例:20200202,反转后20200202,输入A, B两个年份,年份均为大于999和小于10000之间的整数,计算两个年份间的回文整数的个数,每行2个年份,当某一年份输入位0时结束。
例:
输入:
2001 2009
2020 2020
0 0
输出:
1
1
说明:为了便于看到输入的内容,程序中添加了提示输入和报错输入。
代码块:
/*思路:由于是回文整数,把年份4位数字颠倒过来,判断颠倒后的数字是否符合月日的规范范围,
闰年函数和日期判断函数是为了判断2月的天数*/
#include <stdio.h>
#include <stdlib.h>
#define N 100
#define TRUE 1
#define FALSE 0
typedef int Status;
void inputYear(int *yearA, int *yearB, int *count); //年份输入函数
Status judgeInputYear(int year); //年份输入判断是否合理
Status LeapYear(int year); //闰年函数
void reverseYear(int *year); //反转函数,年份颠倒
Status judgeDate(int year); //日期判断函数
void palindromeCount(int *yearA, int *yearB, int *count); //回文整数函数
void inputYear(int *yearA, int *yearB, int *count)
{
int i;
for(i=0; ; i++)
{
printf("Enter A year and B year: ");
scanf_s("%d %d", &yearA[i], &yearB[i]);
while(judgeInputYear(yearA[i])||judgeInputYear(yearB[i])||yearA[i]>yearB[i])
{
printf("Error! Retry!\nEnter A year and B year: ");
scanf_s("%d %d", &yearA[i], &yearB[i]);
}
if(yearA[i]==0||yearB[i]==0)
break;
}
*count=i;
}//inputYear
Status judgeInputYear(int year)
{
if((year<1000&&year!=0)||year>9999)
return TRUE;
else
return FALSE;
}//judgeLeapYear
Status LeapYear(int year)
{
if((year%4==0&&year%100!=0)||(year%400==0))
return TRUE;
else
return FALSE;
}//LeapYear
void reverseYear(int *year)
{
int i, y[4], sum=0;
for(i=0; i<4; i++)
{
y[i]=*year%10;
*year/=10;
sum=y[i]+sum*10;
}
*year=sum;
}//reverseYear
Status judgeDate(int year, int reverse)
{
int month=reverse/100;
int day=reverse%100;
if(month>=1&&month<=12)
{
switch(month)
{
case 1: if(day>=1&&day<=31) return TRUE; else return FALSE; break;
case 2:
if(LeapYear(year))
{
if(day>=1&&day<=29) return TRUE;
else return FALSE;
}
else
{
if(day>=1&&day<=28) return TRUE;
else return FALSE;
}
break;
case 3: if(day>=1&&day<=31) return TRUE; else return FALSE; break;
case 4: if(day>=1&&day<=30) return TRUE; else return FALSE; break;
case 5: if(day>=1&&day<=31) return TRUE; else return FALSE; break;
case 6: if(day>=1&&day<=30) return TRUE; else return FALSE; break;
case 7: if(day>=1&&day<=31) return TRUE; else return FALSE; break;
case 8: if(day>=1&&day<=31) return TRUE; else return FALSE; break;
case 9: if(day>=1&&day<=30) return TRUE; else return FALSE; break;
case 10: if(day>=1&&day<=31) return TRUE; else return FALSE; break;
case 11: if(day>=1&&day<=30) return TRUE; else return FALSE; break;
case 12: if(day>=1&&day<=31) return TRUE; else return FALSE; break;
default: return FALSE; break;
}
}
else
return FALSE;
}//judgeDate
void palindromeCount(int *yearA, int *yearB, int *count)
{
int i, j, originYear, rever, countYear;
for(j=0; j<*count; j++)
{
for(i=yearA[j], countYear=0; i<=yearB[j]; i++)
{
originYear=i;
rever=i;
reverseYear(&rever);
if(judgeDate(originYear, rever))
countYear++;
}
printf("%d\n", countYear);
}
}//palindromeCount
int main()
{
int *yearA=(int*)malloc(N*sizeof(int));
int *yearB=(int*)malloc(N*sizeof(int));
int *count=(int*)malloc(sizeof(int));
inputYear(yearA, yearB, count);
palindromeCount(yearA, yearB, count);
free(count);
free(yearB);
free(yearA);
system("pause");
return 0;
}