回文数、回文字符串的判断
一、回文数,回文串的描述:
形如 ‘1 2 3 4 3 2 1’ 这样的数字,我们称为回文数。
形如 ‘ a s d 1 2 3 2 1 d s a ’ 这样的字符串,我们称为回文串。
注:即正着读和反着读可以得到同样的结果
二、回文字符串的判断
(1).通过一维动态数组从键盘读入要判断的字符串。
a=(char*)malloc(sizeof(char)*len);
for(int i=0;i<len;i++)
scanf("%c",a+i);
(2).记录初始化的数组,因为指针会修改当前数组。
//记录第一个数组
char array_record[len];
for(int i=0;i<len;i++)
array_record[i]=*(array1+i);
(3).逆置数组:数组第 i 个元素与数组第 len-i-1 个元素互换。
char * setback(char * array,int len);
(4).比较输出:如果两个数组相等,为回文字符串,否则不是回文字符串
int comparisonarray(char * array1,char * array2,int len);
三、源代码
#include<stdio.h>
#include<stdlib.h>
//初始化动态数组
char *initialarray(int len)
{
char * a;
a=(char*)malloc(sizeof(char)*len);
for(int i=0;i<len;i++)
scanf("%c",a+i);
getchar();
printf("initial array success!\n");
return a;
}
//数组的逆向转置
char * setback(char * array,int len)
{
char temp;
for(int i=0;i<len/2;i++)
{
temp=*(array+i);
*(array+i)=*(array+len-i-1);
*(array+len-i-1)=temp;
}
return array;
}
//打印数组
void printarray(char *array,int len)
{
for(int i=0;i<len;i++)
{
printf("%c ",*(array+i));
}
}
//比较数组
int comparisonarray(char * array1,char * array2,int len)
{
for(int i=0;i<len;i++)
if(*(array1+i)!=*(array2+i))return 0;
return 1;
}
int main()
{
int len;
printf("Please input the length of string:");
fflush(stdout);
scanf("%d",&len);
fflush(stdin);//清除缓冲区,或者在下一个scanf前加空格
//初始化第一个数组
char *array1=initialarray(len);
//记录第一个数组
char array_record[len];
for(int i=0;i<len;i++)
array_record[i]=*(array1+i);
//printarray(array1,len);//test
//逆置输入的数组
char *array2=setback(array1,len);
//printarray(array2,len);//test
//比较两个数组,并输出结果
if(comparisonarray(array_record,array2,len))
{
printarray(array_record,len);
printf(" is a palindrome number string!");
}
else
{
printarray(array_record,len);
printf(" is not a palindrome number string!");
}
return 0;
}
调试结果:
对于单独的字符串,可用以上所述进行判断,对于需要连续判断的回文数,应该怎么做呢?
例如:请输出1000~10000的回文数。
- 想想要是把每一个数都进行字符数组存储,然后转置,在进行判断是否为回文数,那么这个算法的复杂度就超出我们想象了。
- 于是我们提出了逆数处理(就是把这个数反向表达,如123 转换为321,其实也是逆置的思想)
下面来看看具体如何做吧~~~~~
一、我们需要输入要求的范围:(如1000~10000)
二、算法设计:
int re=0;//存放逆置的数
int j = i;//标记要判断的数
while(i>0)
{
re*=10;//将取出来的数(十位变百位)
re+=i%10;//取出高位数字
i/=10;//这个数缩小10,进行下一个高位处理
}
三、源代码
#include<stdio.h>
#include<stdlib.h>
int palindrome(int i)
{
int re=0;//存放逆置的数
int j = i;//标记要判断的数
while(i>0)
{
re*=10;//将取出来的数(十位变百位)
re+=i%10;//取出高位数字
i/=10;//这个数缩小10,进行下一个高位处理
}
if(re==j) return 1;
else return -1;
}
int main()
{
int xia_xian,shang_xian,j;
printf("please input the bound of number:");
fflush(stdout);
scanf("%d %d",&xia_xian,&shang_xian);
for(int i=xia_xian;i<=shang_xian;i++)
{
if(palindrome(i)>0)
{
printf("%4d ",i);
j++;
}
if(j==10)
{
printf("\n");
j=0;
}
}
return 0;
}