相信大家在肝OJ的过程中,不可避免地会被反转字符串、判断回文数等问题困扰,饺子在这里给大家提供一些思路。
1.判断是否回文。我们首先要用gets()函数读入字符串,然后用strlen()函数求出字符串的长度。分奇偶数找到中间位置,然后向两端遍历字符数组,如果两个方向对应字符不同就把循环break,否则继续进行操作。循环后判断是否遍历完整个数组,如果是就是回文数,否则不是回文数。
2.同时判断是否回文我们还可以用反转字符串的方法。先用gets()读入字符串,用strlen()求出字符串的长度,从最后一个字符向前将反转后的字符串存放到另一个数组当中,然后在后面添加一个 '\0',然后直接用strcmp判断是否与原字符串相等,相等就是回文数,否则不是回文数。
3.反转数字时我们有可能会遇到忽略前导0以及带负号的情况,这时候我们就必须用字符串来处理。忽略前导0的思路就是先找到字符串末尾第一个不是'0'的字符。
接下来我们以( TSOJ 1073 数字反转 )为例进行讲解,代码如下。
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000];
int head,tail,i;
while(scanf("%s",a)!=EOF)
{
if(strlen(a)==1)
{
printf("%c\n",a[0]);
continue;
}
if(a[0]=='-')
{
head=1;
tail=strlen(a)-1;
while(a[tail]=='0')
tail--;
printf("-");
for(i=tail;i>=head;i--)
printf("%c",a[i]);
printf("\n");
}
else
{
head=0;
tail=strlen(a)-1;
while(a[tail]=='0')
tail--;
for(i=tail;i>=head;i--)
printf("%c",a[i]);
printf("\n");
}
}
return 0;
}
这题用gets()和scanf()都是可以的,原因是字符串中不会有多余的空格。
因为只是要输出反转后的数字,我们并不需要存储它或作其他用途,由此我们可以直接一个字符一个字符地输出。( 当然如果要存储它也很简单,只需要把一个字符一个字符输出改成一个字符一个字符地存过去。)
首先,因为要反转的数字有可能带负号,我们就要先判断是否带负号,如果带了负号,就先输出负号然后将后面的数字反转,如果不带,就反转整个字符串。
然后,我们要考虑忽略前导0的问题,这也很简单,我们只需要用一个变量tail从字符串末尾找到第一个不是'0'的字符( 注意:这里是字符'0',是ASCII码的48,与0是完全不同的。),因为要忽略前导0,我们在将0这个数字进行反转的时候就会出一些问题,所以要将0的反转单独拿出来讨论( 我的代码是将长度为1的字符串直接输出,就是因为考虑到这个问题 )。
接下来就是无脑的循环,将剩下的字符依次输出了。( 但是如果要存储的话,别忘了最后添加一个'\0',这样才能以字符串的形式输出 )
最后,别忘了在依次输出完所有字符之后进行换行哦!
此类题目大概就是这个解法,大家可以去TSOJ中找相关例题再练练手。