回文序列的判断
一,数组方法
#include<stdio.h> #include<string.h> #define NUM 100 int main(){ char str[NUM]; int flag=0; int len=strlen(str); scanf("%s",str); for(int i=0;i<len/2;i++){ if(str[i]==str[len-i-1]) flag=1; else{ flag=0; break;//只要有一个为0,就判断不是回文。 } } if(flag) printf("是回文!"); else printf("不是回文!"); }
#include<stdio.h> #define MAXLINE 80 int main(){ int i,k; char line[MAXLINE]; //输入字符串 printf("Enter a string:"); //输入字符串 k=0; while((line[k]=getchar())!='\n') k++; line[k]='\0';//必须要人为加上‘\0’. //分别指向第一个和最后一个元素位置。 i=0; k-=1; while(i<k){ if(line[i]!=line[k])//若对应字符不相等,则提前结束循环。 break; i++; k--; } //判断while循环是否正常结束,若是则说明字符串是回文。 if(i>=k) printf("是回文!"); else printf("不是回文!"); return 0; }
二,递归
递归的方法是真的骚,要知道,递归能适用于什么情况,首先,要进行多次类似的运算,范围越来越小,要有一个结束条件。
/递归 #include<stdio.h> #include<string.h> int judge(int low,int high,char *arr,int len){ //最终条件。 if(len==0 || len==1) return 1; if(arr[low]!=arr[high]) return 0; return judge(low+1,high-1,arr,len-2); } int main(){ char arr[10]="aaabbaaa"; int len=strlen(arr); if(judge(0,len-1,arr,len)) printf("是!"); else printf("不是!"); return 0; } /*递归的作用在于把问题的规模不断缩少,直到问题缩少到简单地解决 通过观察可以知道,一个回文字符串其中内部也是回文。所以,我们只需要以去掉两端的字符的形式一层层检查, 每一次的检查都去掉了两个字符,这样就达到了缩少问题规模的目的。 1. 字符串长度可能会奇数或偶数: 如果字符串长度是奇数,字符串会剩下最中间那位字符,但其不影响回文。当检查到长度为1的时候即代表此字符串是回文 如果字符串长度是偶数,当两端的字符串两两比较检查后不会剩下字符。即检查到长度为0的时候即代表此字符串是回文 2. 如果检查到两端两个字符不相同。则说明此字符串不是回文,直接返回0,不需要继续检查
这个是看的别人的,叫啥我也忘了,但是这个方法是真的挺有想法的。
三.指针
指针跟数组差不多,
int is_pal(char* str) { char* start = str; char* end = str + strlen(str) - 1; while (start < end) { //比较前后对称位置是否相等 if (*start != *end) { return 0; } start++; end--; } return 1; }
四.数字型回文
上面的是字符串判断回文,
下面这个算法还是挺好用的。
bool symm(long m){ long temp = m,n=0; while (temp){ n = n*10+temp%10; temp = temp/10;//逆序输出数 } return (m == n); }
上面有个别是我找的其他博主的原创来自己打的,可能相似度会很高,但是主要还是想让大家学到东西。