对于字母或者数字类型均可以(可以对两者进行相互转化)类型的用第二种(栈和队列)对于数字用第一种算法
提前说一下写这个题的小背景,在学校训练了几天在等待开学的过程中实在是太过于无聊就回顾一下以前学过的基础和一些算法吧!
简单说一下回文串:
回文串是说正着读或者反着读都一样的字串,或者为一个整数(这个无所谓可以根据题目自行修改下面的模板),简单思想就是对所求数反着存到另一个数,判断两个数是否相等,相等就输出过程中的数不是的话本来的数加上反着存的数继续往下判断就好;
下面是写的一个简单代码:
#include<stdio.h>
int get_f(int k)
{
int i,m=0,t;
int s=k;
while(s>0)
{
m=m*10+s%10;
s/=10;
}
return m==k?1:m;
}
int main()
{
int a[200],n,i,j;
while(scanf("%d", &n))
{
a[0]=n;
for(i=1; ;i++)
{
if(get_f(n)==1)
break;
else
{
n+=get_f(n);
a[i]=n;
}
}
for(j=0; j<i; j++)
printf("%d ", a[j]);
printf("\n");
}
return 0;
}
下面是栈的方式判断:
核心思想就是将前一部分存入另一个字串然后进行比较判断;看代码中间的解释应该可以看懂!
#include<stdio.h>
#include<string.h>
int main()
{
int len,next,i;
char s[200],a[200];
while(gets(s))
{
len=strlen(s);
int mid=len/2-1;
int top=0;
for(i=0; i<=mid; i++)
a[++top]=s[i];//top=0时并没有储存字符
if(len%2==0)
next=mid+1;
else
next=mid+2;
for(i=next; i<=len-1; i++)
{
if(a[top]!=s[i])
break;
top--;
}
if(top==0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}