回文字符串顾名思义就是正读和反读一样的字符串例如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;
}
最大的改变是在上一次优化的基础上去掉了把各位数字存储进数组的过程,在求各位数学的同时进行重组数字,使其变得更加简洁。
经过这次的练习,我发现代码不是敲出来、能运行就可以了,我们应该不断的测试、思考、修改优化,力求能够优化到最简且普遍使用的地步。
以上就是本期的全部内容,如果对你有帮助的话,就请点个赞、点个关注吧!