一、回文数
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;
}