判断回文字符串

回文字符串顾名思义就是正读反读一样的字符串例如11,121,12321……

其实找回文字符串的本质就是找数字的各位数字然后把他们倒序组合成一个新的数字再和原数字比较。

  • 基础求法 

基础求法是最简单暴力的方法,直接求出所求数字的各位数字,然后第一位和最后一位比较,第二位和倒数第二位比较……这种方法是比较简单直接的,但是最大的弊端是要知道所求数字的位数才可操作,因此实用性不大。

代码如下:


int main()
{
    int n;
    printf("请输入一个五位数\n");
    scanf("%d", &n);
    int a = n % 10;
    int b = n / 10 % 10;
    int c = n / 100 % 10;
    int d = n / 1000 % 10;
    int e = n / 10000 % 10;
    if (a == e && b == d)
        printf("YES!");
    else
        printf("NO!");
}

  •  数组法

数组法就是创建一个数组存储所求数字的各位,然后再组成一个新的数字再和原数字比较。

代码如下:

int main()
{
	int i = 0, n = 0,sum=0,m=1,k=0;
	scanf("%d", &n);
	int arr[6] = { 0 },j=0;
	for (i = 1; i <= n; i++)
	{
		//1-n的数
		j = 5,m=i ;
		while (m != 0)
			{
			    //把i的各位按个十百千万倒序放在arr[6]中
				arr[j--] = m % 10;
				m /= 10;
			}
		for (j=0; j<6; j++)
		{
			//计算出i的逆序数
			m = 1;
			for (k = 0; k < j; k++)//计算权重
			{
				if(arr[k]!=0||(arr[k-1]!=0&&arr[k+1]!=0))
                      m *= 10;
			}
			sum += arr[j] * m;//arr[0]*10^0+arr[1]*10^1+...+arr[5]+10^5
			//arr[j]使用完后不用清零,因为后续arr[j]的位置会被新的值覆盖掉
		}
		if (sum == i )
			printf("%d\n", i);
        sum = 0;
	}
	return 0;
}

这个代码的优点是可以输出1-n之间所有的回文字符,但是其缺点是只适用于n位数少于五位数的情况,位数过多会出现漏数的情况。例如10001其各位储存入数组后,在计算权重重组数字时,判断条件就要进一步添加条件才可正常输出,所以实用性也不大。

为了让它能够用于普遍情况,我对其进行了修改优化,去掉了计算权重的步骤,在所求数字各位存储进数组后,直接循环重组数字,让其能够适用于普遍情况。

代码如下:

int main()
{
	int i = 0, n = 0, sum = 0, m = 1, k = 0;
	scanf("%d", &n);
	int arr[100] = { 0 }, j = 0;
	for (i = 1; i <= n; i++)
	{
		//1-n的数
		j = 0, m = i, k = 0;

		while (m != 0)//把i的各位按个十百千万...顺序放在arr[6]中,k充当计数作用
		{
			arr[k++] = m % 10;
			m /= 10;
		}
		for (j = 0; j < k; j++)
		{
			sum = sum * 10 + arr[j];
		}
		if (sum == i)
			printf("%d ", i);
		sum = 0;
	}
	return 0;
}

虽然其适用于普遍情况,但是,在修改过程中发现还可以对其进行进一步的优化,让其变得更加简洁。

代码如下:

int main()
{
	int n;
	scanf("%d", &n);
	int i = 0;
	for (i = 1; i <= n; i++)
	{
		int t = 0, num = i;
		while (num > 0)
		{
			t = t * 10 + num % 10;
			num = num / 10;
		}
		if (t == i)
			printf("%d\n", i);
	}
	return 0;
}

最大的改变是在上一次优化的基础上去掉了把各位数字存储进数组的过程,在求各位数学的同时进行重组数字,使其变得更加简洁。

经过这次的练习,我发现代码不是敲出来、能运行就可以了,我们应该不断的测试、思考、修改优化,力求能够优化到最简且普遍使用的地步。

以上就是本期的全部内容,如果对你有帮助的话,就请点个赞、点个关注吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值