《C语言》回文串与回文数问题
一.回文串.
“回文串”是一个正读和反读都一样的字符串,初始化标志flag=true,比如“level”或者“noon”等等就是回文串。
1.如何判断是回文串
1.遍历字符串长度的一半
2.字符串从前数第i个和字符串从后数第i个对比,不相等就不是回文串,相等则是回文串。
2.代码实现
#include#include#include#pragma warning(disable:4996)bool isPalindrome(char* s) //判断是否为回文字符串{int len = strlen(s); //为字符串的长度for (int i = 0; i < len / 2; i++) //遍历字符串长度的一半即可以{if (s[i] != s[len - i - 1])return false; //从前数第i个对应字符串尾的第j个,其中j=len-i-1}return true;}main(){char s[5];scanf("%s",s);if (isPalindrome(s))printf("是回文串");elseprintf("不是回文串");}
二.回文数
“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。 设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。
注意:
1.偶数个的数字也有回文数124421。
2.小数没有回文数。
3.0是回文数。
4.负数不是回文数。
1.如何判断是回文数
方法(1)
举个例子1331
执行1331%10,我们将得到最后一位数字1.
要得到倒数第二位数字,我们可以先通过除以10把最后一位数字从1331中移除,即1331/10=133,再求出上一步结果除以10的余数,133%10=3,就可以得到倒数第二位数字。
如果我们把最后一位数字乘以10,再加上倒数第二位数字,1*10+3=13,就得到我们想要的反转之后的数字。
对于其他更大的数字只需要重复执行,,操作即可以。
2.代码实现
#include#includebool isPalindrome(int x){if(x==0)return true; //0是回文数if(x<0)return false; //负数的话一定不是回文数long long t=x, ret=0; //ret 是记录反转后的数while(t!=0)//如果t为0时,结束循环{ret=ret*10+t%10; //解析看t/=10;}return ret==x; //如果ret=x的话,则返回true}main(){long long c;while(~scanf_s("%d", &c)) //输入截止的条件 {if (isPalindrome(c)!=0) printf("是回文数");else printf("不是回文数");}}
while(~scanf_s("%d",&c)) // while(scanf_s("%d",&c)!=EOF) //在这里被认为是输入截止的条件,即不再输入数。
3.优化
时间复杂度减小
数字规模减小,反转数字的位数已经达到原始数字的一半
特殊情况
负数不是回文数
如果数字的最后一位为0,为了使该数字为回文数,应该满足第一位也为0,很显然只有0成立
考虑数字长度为奇数和偶数的情况
代码
#include#includebool isPalindrome(int x) {int num = 0;if (x == 0)return true; //0是回文数if (x num) {num = num * 10 + x % 10;x /= 10;}return x == num || x == num / 10; //当x==num这个是长度为偶数的情况,x==num/10是奇数的情况,只有让num/10才能使得x==num}main(){int c;while(~scanf_s("%d", &c)) //输入截止{if (isPalindrome(c))printf("是回文数");else printf("不是回文数");}}
方法(2).转为回文串去判断
#include#include#includebool isPalindrome(int x){ char s[100]; sprintf(s,"%d",x);//这里用sprintf进行整形转换.把整数x,转化为字符串存入s中 int L=0,R=0;//从数组头尾两边向内判断嘛,定义两个左右索引 R = strlen(s)-1;//数组从0开始,减一位 for(R,L;R > L;R--,L++)//你从头尾分别向内判断,头部索引++,尾部索引--,若是头的索引都大于尾部的索引,说明判断完成 { if(s[R] != s[L]) { return false; } } return true;}main(){int c;while(~scanf_s("%d", &c)) //输入截止{if (isPalindrome(c))printf("是回文数");else printf("不是回文数");}}