#回文数
#一开始写的有问题的代码:
#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#include<string.h>
bool is_number(int j);
bool is_special(int j);
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int N;
scanf("%d",&N);
while(N>=10000101&&N<=89991231)
{
for(int i=N;i<=89991231;i++)
{
int j=i;
int count=0,count1=0;
if(is_number(j)&&count!=1)
{
printf("%d\n",j);
}
if(is_number(j)&&is_special(j)&&count1!=1)
{
printf("%d",j);
}
}
}
return 0;
}
bool is_number(int j)
{
char a[8];
sprintf(a,"%d",j);
int left=0;
int right=strlen(a)-1;
while(left<right)
{
if(a[left]!=a[right])
{
return false;
left++;
right--;
}
}
return true;
}
bool is_special(int j)
{
int isnumber=1;
int special=0;
char a[8];
sprintf(a,"%d",j);
int left=0;
int right=strlen(a)-1;
while(left<right)
{
if(a[left]!=a[right])
{
isnumber=0;
left++;
right--;
}
}
if(a[0]==a[2]&&a[5]==a[2]&&a[7]==a[5])
{
if(a[1]!=a[0]&&a[1]==a[3]&&a[4]==a[3]&&a[6]==a[4])
{
special=1;
}
}
if(is_number(j)&&special==1)
{
return true;
}
}
这时left++,right--应在if语句外面
#经过改进后:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
bool is_number(int j);
bool is_special(int j);
int main(int argc, char *argv[])
{
int N;
scanf("%d", &N);
for (int i = N; i <= 89991231; i++)
{
if (is_number(i))
{
printf("%d\n", i);
}
if (is_special(i))
{
printf("%d\n", i);
}
}
return 0;
}
bool is_number(int j)
{
char a[8];
sprintf(a, "%d", j);
int left = 0;
int right = strlen(a) - 1;
while (left < right)
{
if (a[left] != a[right])
{
return false;
}
left++;
right--;
}
return true;
}
bool is_special(int j)
{
char a[8];
sprintf(a, "%d", j);
if (a[0] == a[2] && a[5] == a[2] && a[7] == a[5])
{
if (a[1] != a[0] && a[1] == a[3] && a[4] == a[3] && a[6] == a[4])
{
return true;
}
}
return false;
}
#这时候发现运行超时,而减少运行时间只有限制条件来减少循环;,而且i循环条件应该是到99991231;89991231那是对N的限制条件;
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
bool is_number( int j);
bool is_special( int j);
int main(int argc, char *argv[])
{
int N;
int count,count1=0;
scanf("%d", &N);
for (int i = N+1;i<= 99991231;i++)
{
if(i%10000/100>12||i%10000/100==0||i%100>31)continue;
if (is_number(i)&&count<1)
{
printf("%d\n", i);
count++;
}
if (is_special(i)&&count1<1)
{
printf("%d\n", i);
count1++;
}
}
return 0;
}
bool is_number( int j)
{
char a[8];
sprintf(a, "%d", j);
int left = 0;
int right = strlen(a) - 1;
while (left < right)
{
if (a[left] != a[right])
{
return false;
}
left++;
right--;
}
return true;
}
bool is_special( int j)
{
char a[8];
sprintf(a, "%d", j);
if (a[0] == a[2] && a[5] == a[2] && a[7] == a[5])
{
if (a[1] != a[0] && a[1] == a[3] && a[4] == a[3] && a[6] == a[4])
{
return true;
}
}
return false;
}
通过对i限制条件来使循环减少;
注意:要对变量初始化,不同的编译环境处理不同,有的不初始化变量默认为0,但有的不行;
for循环内不能int i=N;
上面代码我没给count和count1初始化测试结果如下:
#最后能通过的代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
bool is_number( int j);
bool is_special( int j);
int main(int argc, char *argv[])
{
int N;
int count=0,count1=0;
int i;
scanf("%d", &N);
for ( i = N+1;i<= 99991231;i++)
{
if(i%10000/100>12||i%10000/100==0||i%100>31)continue;
if (is_number(i)&&count<1)
{
printf("%d\n", i);
count++;
}
if (is_special(i)&&count1<1)
{
printf("%d\n", i);
count1++;
}
}
return 0;
}
bool is_number( int j)
{
char a[8];
sprintf(a, "%d", j);
int left = 0;
int right = strlen(a) - 1;
while (left < right)
{
if (a[left] != a[right])
{
return false;
}
left++;
right--;
}
return true;
}
bool is_special( int j)
{
char a[8];
sprintf(a, "%d", j);
if (a[0] == a[2] && a[5] == a[2] && a[7] == a[5])
{
if (a[1] != a[0] && a[1] == a[3] && a[4] == a[3] && a[6] == a[4])
{
return true;
}
}
return false;
}
#这时如果严谨点要对N的输入增加条件,确保输入的月份和天数大小合格,则以下代码符合
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
bool is_number( int j);
bool is_special( int j);
int maxday(int month,int year);
bool isleap(int year);
int main(int argc, char *argv[])
{
int N=0;
int count=0,count1=0;
scanf("%d", &N);
if(N%10000/100<=12&&N%10000/100!=0&&N%100<maxday(N%10000/100,N/10000)){
for (int i = N+1;i<= 89991231;i++)
{
if(i%10000/100>12||i%10000/100==0||i%100>31)continue;
if (is_number(i)==1&&count<1)
{
printf("%d\n", i);
count++;
}
if (is_special(i)==1&&count1<1)
{
printf("%d\n", i);
count1++;
}
}
}
return 0;
}
bool is_number( int j)
{
char a[9];
sprintf(a, "%d", j);
int left = 0;
int right = strlen(a) - 1;
while (left < right)
{
if (a[left] != a[right])
{
return false;
break;
}
left++;
right--;
}
return true;
}
bool is_special( int j)
{
char a[9];
sprintf(a, "%d", j);
if (a[0] == a[2] && a[5] == a[2] && a[7] == a[5])
{
if (a[1] != a[0] && a[1] == a[3] && a[4] == a[3] && a[6] == a[4])
{
return true;
}
}
return false;
}
int maxday(int month,int year)
{
int n=month-1;
int day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(month==2&&isleap(year))
{
return 29;
}
else{
return day[n];
}
}
bool isleap(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)
{
return true;
}
else{
return false;
}
}