回文序列的判断
目录
一,数组方法
#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);
}
上面有个别是我找的其他博主的原创来自己打的,可能相似度会很高,但是主要还是想让大家学到东西。