课外拓展3.判断回文

简介: 递归的方法是真的骚,要知道,递归能适用于什么情况,首先,要进行多次类似的运算,范围越来越小,要有一个结束条件。

回文序列的判断


一,数组方法


#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);
}


上面有个别是我找的其他博主的原创来自己打的,可能相似度会很高,但是主要还是想让大家学到东西。

目录
相关文章
|
5月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 查找整数
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 查找整数
47 0
|
5月前
|
前端开发 索引
七大基本判断问题,你都get到了吗
七大基本判断问题,你都get到了吗
|
5月前
|
算法 搜索推荐 程序员
第四十九练 请以递归方式实现判断一个字符串是否为回文字符串的
第四十九练 请以递归方式实现判断一个字符串是否为回文字符串的
38 0
|
5月前
|
算法 搜索推荐 程序员
第四十六练 请以递归方式实现计算整数列表的和
第四十六练 请以递归方式实现计算整数列表的和
39 2
|
5月前
Leecode之面试题消失的数字
Leecode之面试题消失的数字
|
5月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 01字串
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 01字串
30 0
|
5月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊的数字
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊的数字
43 0
|
5月前
|
存储
LeetCode 取经之路——第三题-无重复长度的最长子串
LeetCode 取经之路——第三题-无重复长度的最长子串
47 1
|
5月前
7-7 念数字 (15 分)(用数组简化判断过程)
7-7 念数字 (15 分)(用数组简化判断过程)
44 0
|
机器学习/深度学习 算法 图计算
代码随想录训练营day59| 503.下一个更大元素II 42. 接雨水
代码随想录训练营day59| 503.下一个更大元素II 42. 接雨水