C语言回文串

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

一、回文数,回文串的描述:

形如 ‘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;
}
调试结果:

在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值