问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言算法经典基础题型——求一个数的回文数(两种方法)

创作时间:
作者:
@小白创作中心

C语言算法经典基础题型——求一个数的回文数(两种方法)

引用
CSDN
1.
https://blog.csdn.net/hjx1235/article/details/143220301

首先我们先了解一下回文数的定义:回文数是从前往后和从后往前读都相同的正整数,具有对称性、有限性、递增性等特点。在数学研究和实际应用中,回文数有广泛应用,如数据校验、密码学等。比如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;  
}  

运行结果

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号