C语言算法经典基础题型——求一个数的回文数(两种方法)
C语言算法经典基础题型——求一个数的回文数(两种方法)
首先我们先了解一下回文数的定义:回文数是从前往后和从后往前读都相同的正整数,具有对称性、有限性、递增性等特点。在数学研究和实际应用中,回文数有广泛应用,如数据校验、密码学等。比如1221就是回文数。
接下来我们用两种算法解决这个问题。
方法一
回文数的第i位和倒数第i位肯定相等,因此我们只需比较第1位和倒数第1位,比较第2位和倒数第2位……
那么怎么找一个数各个位置上的数字呢?
假如高位数字我们记作left,低位数字我们记作right。
先研究right数字,比如12345,最低位是5,那么我们可以通过12345 mod 10 == 5 (取余)来取到right数字,用C语言代码表示为12345%10,将12345%10之后的数再mod 10 可以得到right数字4,以此类推可以得到所有的right数字。
再来研究left数字,还拿12345举例,最高位是1,那么我们可以用12345 除以10000来得到left数字1,而要想得到left数字2,我们需要12345%10000得到2345,然后2345/10得到234,最后234/100得到left数字2。
但是以上方法是对于给定的12345这个五位数为例适用,但对于任意给定的数我们如何求呢?
我们再来仔细分析,对于right数字,可以对所给的数字连续取余就可以得到。
对于left数字,首先求出所给数的长度len,用所给数/10的(len-1)次方,得到最高位(就是上面12345/10000步骤),然后所给数%10的(len-1)次方得到所给数1(就是上面的2345),用所给数1/10得到所给数2(234),最后所给数2/10的(len-3)次方得到left数字(上面的2)。
每次循环得到的right和left进行比较,最终用if语句进行判断。
代码实现
#include <stdio.h>
#include <math.h>
int main()
{
int a, i, left, right, b, flag;
scanf("%d", &b);
// 求整数a的长度
a = b;
for (i = 0; i >= 0; i++)
{
a /= 10;
if (a == 0)
{
break;
}
}
for (; i > 0; i -= 2)
{
left = b / (pow(10, i - 1));
right = b % 10;
b = b % int(pow(10, i - 1)) / 10;
if (left == right)
{
flag = 1;
}
else
{
printf("No");
break;
}
}
if (flag == 1)
{
printf("Yes");
}
return 0;
}
代码解读
① b表示需要输入的数,i表示该数的长度,引入变量a的原因是让a=b,用a的值来求b的长度i,并且不改变b的值(也就是说让b在下面第二个循环中的值还是一开始输入的值)。
② 第一个循环是求b的长度i,第二个循环是判断是否是回文数。
方法二
既然回文数正着读和反着读相等,那么我们不妨找出反着读的数reverse,判断两者是否相等。
我们可以通过以下方法得到reverse:
首先先取输入数m的最低位,m%10得到,然后将m的最低位赋给reverse(reverse=reverse*10+m),最后将m最低位去掉(m/10),接着重复上述循环。
循环结束后比较m和reverse 是否相等。
代码实现
#include <stdio.h>
int main()
{
int num;
int num1;
int reverse;
int m;
scanf("%d", &num);
num1 = num;
reverse = 0;
while (num1 != 0)
{
m = num1 % 10; // 取出最低位
reverse = reverse * 10 + m; // 把最低位给reverse
num1 = num1 / 10; // 去掉num的最低位
}
if (num == reverse)
printf("Yes\n");
else
printf("No\n");
return 0;
}