回文数及回文字符串的判断

一、回文数

1.非递归算法

(1)解题思路

把目标数n赋给另一个变量s1,然后将s1的高位逐个变为低位(也就相当于把数s1打个颠倒),再判断调整完顺序之后的(s1调到之后为s2)s2值与最初的n的值进行比较,看是否相等,相等的话即为回文数,反之则不是回文数。

(2)源程序

#include <stdio.h>
#include <stdlib.h>
void main()
{
    int i=0,s,n;
    printf("请输入一个数:");
    scanf("%d",&n);
    s=n;
    while(s!=0){
        i=i*10+s%10;
        s/=10;
    }
    if(i==n)
        printf("该数是回文数!");
    else
        printf("该数不是回文数!");
}

2.递归算法

(1)解题思路

1)先写一个递归调用的子函数,出口为当 n<=1 return 1;然后定义两个变量,分别用于存放首尾数组下标的标记,每次递归判断首尾两数是否相等,同时数的个数-2,通过首标记后移+尾标记前移来完成这个递归式。
2)输入一个n值,利用一个while循环来逐位分解n值,此时就需要定义一个数组来存放所分解的值。
3)满足递归式则返回1,输出满足;不满足递归式则返回0,输出不满足。

(2)源程序

#include <stdio.h>
int a[20];
int fun(int m,int b,int n)
{
    if (n <= 1)
    {
        return 1;
    }
    if (a[m] == a[b])
    {
        fun(++m,--b,n-2);
    }
    else
    {
        return 0;
    }
}
void main()
{
    int n, i=0,Fun;
    scanf("%d", &n);
    while (n)
    {
        a[i] = n % 10;
        i++;
        n = n / 10;
    }
    Fun = fun(0,i-1,i);
    if (Fun == 0)
        printf("该数不是回文数!");
    if (Fun == 1)
        printf("该数是回文数!");
}

二、回文字符串

1.非递归算法

(1)解题思路

1)定一个字符型数组用于存放所输入的字符串,数组的长度即为该字符串的长度;
2)利用数组的头(i=0)和尾(j=n-1)的下标,通过i的右移、j的左移来进行左右字符串的比较,全部相等则为回文数,只要有一个不相等就不是回文数。(其实判断比较到字符串中间位置就可以得出结论)

(2)源程序

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
    int j,i,n;
    char ch[100];    //存放键入的字符串
    printf("输入一串字符以用来判断是否是回文。\n");
    scanf("%s",ch); //接受键入的字符串
    n=strlen(ch);//用strlen函数读取字符串的长度值,读到\0时停止
    for(i=0,j=n-1;i<n;i++,j--) 
    {
        if(ch[j]!=ch[i])
        {
            break;
        }
    }
    if(i==n) 
    {
        printf("输入的是回文。\n");
    }
    else
    {
        printf("输入的不是回文。\n");   
    }
}

2.递归算法

源程序

#include <stdio.h>
int elementSize=0; 
char str[50];
int isPalindrome(int i)  //回文判断函数
{ 
if(i>=elementSize-i-1)
       return 1; 
    else if(str[i]==str[elementSize-i-1]) 
       { 
       i++; 
       isPalindrome(i); 
       } 
    else 
       return 0; 
}
static int i=0; 
int main()//主函数
{
      int j=0; 
      char element; 
      printf("输入一串字符以判断是否为回文。\n"); 
      scanf("%c",&element); 
      while(element!='\n')    
          { 
          str[j]=element; 
          elementSize++;
          j++; 
          scanf("%c",&element); 
          } 
      if(isPalindrome(i)) 
          printf("输入的是回文。\n"); 
      else 
          printf("输入的不是回文。\n");    
      return 0; 
}
发布了28 篇原创文章 · 获赞 13 · 访问量 465

猜你喜欢

转载自blog.csdn.net/yo_u_niverse/article/details/105288969