回文日期(蓝桥杯第十一届省赛B组)(C/C++)

为了追求严谨,把日期的所有可能性分析得比较仔细,代码写了快200行,当然出现了超时的情况,可以借鉴一下

#include <stdio.h>
#include <math.h>
int a[8],date,i,b,temp,year,p,count;
int main()
{
	count=0;
	scanf("%d",&date);
	temp=date;
	while(date<=99999999)
	{	
		p=date;
		for(i=0;i<=7;i++)
		{
			b=pow(10,7-i);
			a[i]=p/b;
			p=p-a[i]*b;
		}	
		if(a[0]==a[7]&&a[1]==a[6]&&a[2]==a[5]&&a[3]==a[4]&&(a[4]*10+a[5]<=12))
		{
			if(a[4]==0&&(a[5]==1||a[5]==3||a[5]==5||a[5]==7||a[5]==8))
			{
				if(a[6]*10+a[7]<=31&&a[6]*10+a[7]>0)
				{
					printf("%d\n",date);
					count++;
					break;
				}
			}
			if(a[4]==1&&(a[5]==0||a[5]==2))
			{
				if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
				{
					printf("%d\n",date);
					count++;
					break;
				}
			}
			if(a[4]==0&&(a[5]==4||a[5]==6||a[5]==9))
			{
				if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
				{
					printf("%d\n",date);
					count++;
					break;
				}
			}
			if(a[4]==1&&a[5]==1)
			{
				if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
				{
					printf("%d\n",date);
					count++;
					break;
				}
			}
			if(a[4]==0&&a[5]==2)
			{
				year=a[0]*1000+a[1]*100+a[2]*10+a[3];
				if(year%4==0&&year%100!=0)
				{
					if(a[6]*10+a[7]<=29&&a[6]*10+a[7]>0)
					{
						printf("%d\n",date);
						count++;
						break;
					}
				}
				if(year%400==0)
				{
					if(a[6]*10+a[7]<=29&&a[6]*10+a[7]>0)
					{
						printf("%d\n",date);
						count++;
						break;
					}
				}
				else
				{
					if(a[6]*10+a[7]<=28&&a[6]*10+a[7]>0)
					{
						printf("%d\n",date);
						count++;
						break;
					}
				}
			}	
		}
		date++;	
	}
	if(count==0)
	{
		printf("\n"); 
	}
	count=0;
	while(temp<=99999999)
	{	
		p=temp;
		for(i=0;i<=7;i++)
		{
			b=pow(10,7-i);
			a[i]=p/b;
			p=p-a[i]*b;
		}	
		if(a[0]==a[7]&&a[0]==a[2]&&a[0]==a[5]&&a[1]==a[6]&&a[1]==a[4]&&a[1]==a[3]&&(a[4]*10+a[5]<=12))
		{
			if(a[4]==0&&(a[5]==1||a[5]==3||a[5]==5||a[5]==7||a[5]==8))
			{
				if(a[6]*10+a[7]<=31&&a[6]*10+a[7]>0)
				{
					printf("%d",temp);
					count++;
					break;
				}
			}
			if(a[4]==1&&(a[5]==0||a[5]==2))
			{
				if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
				{
					printf("%d",temp);
					count++;
					break;
				}
			}
			if(a[4]==0&&(a[5]==4||a[5]==6||a[5]==9))
			{
				if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
				{
					printf("%d",temp);
					count++;
					break;
				}
			}
			if(a[4]==1&&a[5]==1)
			{
				if(a[6]*10+a[7]<=30&&a[6]*10+a[7]>0)
				{
					printf("%d",temp);
					count++;
					break;
				}
			}
			if(a[4]==0&&a[5]==2)
			{
				year=a[0]*1000+a[1]*100+a[2]*10+a[3];
				if(year%4==0&&year%100!=0)
				{
					if(a[6]*10+a[7]<=29&&a[6]*10+a[7]>0)
					{
						printf("%d",temp);
						count++;
						break;
					}
				}
				if(year%400==0)
				{
					if(a[6]*10+a[7]<=29&&a[6]*10+a[7]>0)
					{
						printf("%d",temp);
						count++;
						break;
					}
				}
				else
				{
					if(a[6]*10+a[7]<=28&&a[6]*10+a[7]>0)
					{
						printf("%d",temp);
						count++;
						break;
					}
				}
			}	
		}
		temp++;		
	}
	if(count==0)
	{
		printf("\n"); 
	}	
}

 

这里需要特别注意一下,日期的范围不应该只给到89991231,否则有一个评测点过不了,日期的范围最好给到99999999 

猜你喜欢

转载自blog.csdn.net/m0_71934846/article/details/128456809