回文问题

本文探讨了回文的概念,包括回文字符串、回文数字和回文数组。通过实例解释如何判断一个字符串或数字是否为回文,并提供了相关测试用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回文问题

1、什么是回文?

答:如果是一个字符串的话,从左到右读和从右到左读是完全一样的,例如:aaabaaa,level等;

   如果是一个数字的话,就是:1234321等等类似这样的。

 

回文字符串:

首先来判断一个字符串是否是回文字符串。

//判断是否是回文字符串
bool IscircleString(char *str,int len)
{
	char *tmp = (char *)malloc(sizeof(char)*len);
	while(*str != '\0')
	{
		str++;
	}
	str--;
	//不应该使用字符串拷贝函数,因为它从头拷到尾,都是++
	while(*tmp++ = *str--)//将逆序的str拷到tmp
	{
		;
	}
	*tmp = '\0';
	str+=2;
	while(len>=0)//让tmp指向开头
	{
		tmp--;
		len--;
	}
	if(strcmp(tmp,str) == 0)
		return true;
	else
		return false;
	
	free(tmp);
}



回文数字:


//判断是否是回文数字
bool IsCircleNum(int num,int len)
{
	char tmp = 0;
	char *str = (char *)malloc(len*sizeof(char));
	char *start = str;
	char *start1 =str;
	
	int i = 0;
	int num1 = num;
	while(num>0)//将数字转为字符串
	{
		*str = (num%10)+'0';
		num/=10;
		str++;
	}
	*str = '\0';
	for(i = len;i>0;i--)//将字符串逆序转换为正常顺序
	{
		tmp = *start;
		*start = *(start+i-1);
		*(start+i-1) = tmp;
		start++;
		i--;
	}
	while(*start1 != '\0')//字符串的第一个与数字的最后一个比较是否一样
	{
		if(*start1 != ((num1%10) + '0'))
			return false;
		num1/=10;
		start1++;
	}
	return true;
	
	free(str);
}


回文数组:

//判断是否是回文数组
bool IscircleArray(int *arr,int len)
{
	int i = 0;
	for(i = 0;i<len/2;i++)
	{
		if(arr[i] != arr[len-1-i])
			return false;
	}
	return true;
}

测试的主函数:

int main()
{
	//测试回文字符串示例
	char *str = "abccba"; 
	char *str1 = "abccbaa";
	char *str2 = "abccbaasdfcgv";
	char *str3 = "wxyzzyxw";
	printf("%d\n",IscircleString(str,strlen(str)));
	printf("%d\n",IscircleString(str1,strlen(str1)));
	printf("%d\n",IscircleString(str2,strlen(str2)));
	printf("%d\n",IscircleString(str3,strlen(str3)));


	//测试回文数字示例
	printf("%d\n",IsCircleNum(123321,6));
	printf("%d\n",IsCircleNum(1233211,7));

	//测试回文数组示例
	int arr[] = {1,2,3,3,2,1};
	int brr[] = {1,2,3,3,2,1,1};
	int crr[] = {1,2,3,2,1};
	printf("%d\n",IscircleArray(arr,sizeof(arr)/sizeof(arr[0])));
	printf("%d\n",IscircleArray(brr,sizeof(brr)/sizeof(brr[0])));
	printf("%d\n",IscircleArray(crr,sizeof(crr)/sizeof(crr[0])));
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值