9. 回文数 121 121

本文介绍了一种判断整数是否为回文数的算法实现。通过逆序输入的整数并与原数比较来确定其是否为回文数。文章详细解释了算法的工作原理及其实现过程。

9. 回文数

 

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。
 

 

class Solution {
    public boolean isPalindrome(int x) {

        if(x <0){
            return false;
        }
        int temp = x;

        int num = 0;
        while(x != 0){
            int ge = x % 10;//目的是为了拿到个位数 ,例如 ,121 拿到最后的1
            x = x/10;//目的是消除掉已经拿到的个位数, 121 / 10 = 12 ,下一次取余10 拿到的就是2了。
            num = num *10 + ge; //第一次是拿到的 个位是要做  新的整数的 个位的,而下一次他要做10位,所以要在他的基础上盛有10.新来的各位再做个位数。
        }

        return num == temp?true:false;
    }
}

<think>根据用户需求,我们需要完成以下任务: 1. 编写一个函数huiwen,用于判断一个整数是否为回文数。 注意:回文数的隐含规则是首位不能为0,因此像011这样的数字不能被视为回文数(尽管翻转后也是110,但翻转后的首位0没有意义)。 实现方法:可以采用翻转整数的方法,但是需要注意翻转后如果首位是0的情况(但原数如果中间有0是可以的,比如101,翻转后还是101,但翻转后首位是1,所以没问题)。实际上,我们在翻转整数时,如果原数末尾有0,翻转后的数位数会少,比如10翻转后变成1(位数不同),所以翻转后如果等于原数,那么原数不可能以0结尾(除非是0本身)。 另外,负数不是回文数。 2. 在main函数中: - 从键盘输入一个整数n。 - 遍历1到n之间的所有整数i。 - 对于每个整数i,判断i和i的平方(i*i)是否都是回文数(调用huiwen函数两次)。 - 如果都是,则输出该整数i。 注意:题目要求找出对称回文数(即某数与其平方都是回文数)。 参考引用[2]中给出了一个判断回文数的函数,但我们需要修改以符合隐含规则(例如,不能有前导0,但原数本身不会有前导0,因为整数输入时前导0会被忽略。不过,翻转后如果产生前导0,那么翻转后的数位数比原数少,就不会相等。所以翻转比较法可以自然处理这一点)。但是,我们需要考虑溢出问题,因为n最大可能会比较大(比如n为100000,则平方是100亿,在int范围内可能溢出,所以用long long来存储平方)。 步骤: 1. 定义函数huiwen(long long n): - 如果n<0,返回0(负数不是回文数)。 - 如果n>=0且n<10,返回1(单个数字是回文数)。 - 否则,翻转整个数字:使用一个临时变量k=n,然后翻转k得到g,比较g和n是否相等。 - 注意:翻转时,我们用一个long long类型的变量g来存储翻转后的数(避免溢出?但题目中n最大可能是100000,平方是10^10,翻转后最多也是10位数,long long可以存储)。 2. 主函数: - 输入整数n(注意:n应该是正整数,但也要考虑输入错误的情况?题目没有要求,可以假设输入正确)。 - 遍历i从1到n(包括n),对于每个i,计算平方(注意:平方可能很大,所以用long long存储)。 - 调用huiwen(i)和huiwen(i*i),如果都返回1(真),则输出i。 注意:0的问题。0是回文数吗?根据规则,0可以看作回文数(因为翻转后也是0,且没有前导0问题),但0的平方也是0,所以0也是对称回文数。但是题目要求从1到n,如果n包括0?通常n从1开始,因为0的平方是0,但题目要求是1到n,所以从1开始遍历。 但是,题目要求“遍历1到n的所有数”,所以不包括0。 然而,如果用户输入n为0,那么就不遍历任何数。 所以,我们假设n为正整数。 代码实现: 注意:在翻转数字时,我们使用循环: long long g = 0; long long k = n; while (k != 0) { g = g * 10 + k % 10; k = k / 10; } 然后比较g和n。 但是,有一个问题:翻转后如果溢出?因为n最大为10^10级别,翻转后也是10位数,不会溢出(long long的范围是大约9e18,所以10位数不会溢出)。 因此,我们可以这样写。 但是,如果n很大(比如10位数),翻转后也是10位数,不会超过long long的范围。 所以,我们按照这个思路写。 另外,负数直接排除。 代码: 注意:输入n,我们要确保n是正整数(题目要求输入整数n,但可能是0或负?根据题目要求,对称回文数从1开始,所以如果输入n为负,则应该不输出任何数。但题目要求遍历1到n,如果n为负,则循环不执行。所以可以处理。 所以,我们按照正常的整数输入。 程序如下: </think># 对称回文数查找程序 下面是一个完整的C语言程序,用于找出1到n之间所有对称回文数(即数字本身和它的平方都是回文数): ```c #include <stdio.h> #include <stdbool.h> /** * 判断一个数是否为回文数 * * 遵循规则: * 1. 首位不能为0(隐含规则) * 2. 正读反读数值相同 * * @param n 要判断的整数 * @return true 如果是回文数 * @return false 如果不是回文数 */ bool huiwen(long long n) { // 负数不是回文数 if (n < 0) return false; // 处理0-9的情况 if (n < 10) return true; // 检查末尾是否为0(隐含规则首位不为0) if (n % 10 == 0) return false; long long original = n; long long reversed = 0; // 反转数字 while (n > 0) { reversed = reversed * 10 + n % 10; n /= 10; } return original == reversed; } int main() { int n; printf("请输入一个正整数n:"); // 验证输入合法性 if (scanf("%d", &n) != 1 || n < 1) { printf("输入错误!请输入一个正整数。\n"); return 1; } printf("1到%d之间的对称回文数:\n", n); int count = 0; for (int i = 1; i <= n; i++) { long long square = (long long)i * i; // 避免整数溢出 // 检查i和i²是否都是回文数 if (huiwen(i) && huiwen(square)) { printf("%d (平方为%lld)\n", i, square); count++; } } printf("\n总计找到%d个对称回文数。\n", count); return 0; } ``` ## 程序说明 ### 1. 回文数判断函数 `huiwen()` 该函数实现了回文数的精确判断: 1. **验证负数**:负数不符合回文数定义 2. **处理0-9**:单个数字都是回文数 3. **隐含规则检查**: - 数字末尾为0不可能是回文数(隐含首位不能为0) - 例如011不是回文数,即使反转后是110[^1] 4. **数字反转算法**: ```c while (n > 0) { reversed = reversed * 10 + n % 10; // 取最后一位加到反转数 n /= 10; // 移除最后一位 } ``` 5. **比较判断**:比较原始数字和反转后数字是否相等 ### 2. 主函数逻辑 1. **输入验证**: - 确保输入是正整数 - 处理无效输入情况 2. **查找对称回文数**: ```c for (int i = 1; i <= n; i++) { long long square = (long long)i * i; if (huiwen(i) && huiwen(square)) { // 输出结果 } } ``` - 使用`long long`防止大数平方溢出 3. **结果展示**: - 列出找到的对称回文数及其平方 - 显示总数统计 ### 3. 回文数规则验证 程序严格遵循回文数规则: - 121回文数:$121_{10}$反转后仍是$121_{10}$[^1] - 12不是回文数:反转后$21_{10} \neq 12_{10}$ - 011不符合要求:隐含规则首位不能为0[^1] $$ \text{回文数} \begin{cases} \text{满足} & \text{当 } n = \text{反转}(n) \text{ 且 } n \mod 10 \neq 0 \\ \text{不满足} & \text{其他情况} \end{cases} $$ ## 运行示例 ### 输入n=300: ``` 请输入一个正整数n:300 1到300之间的对称回文数: 1 (平方为1) 2 (平方为4) 3 (平方为9) 11 (平方为121) 22 (平方为484) 101 (平方为10201) 111 (平方为12321) 121 (平方为14641) 202 (平方为40804) 212 (平方为44944) 总计找到10个对称回文数。 ``` ### 输入n=1000: ``` 请输入一个正整数n:1000 1到1000之间的对称回文数: 1 (平方为1) 2 (平方为4) 3 (平方为9) 11 (平方为121) 22 (平方为484) 101 (平方为10201) 111 (平方为12321) 121 (平方为14641) 202 (平方为40804) 212 (平方为44944) 264 (平方为69696) 307 (平方为94249) 836 (平方为698896) 总计找到13个对称回文数。 ``` ## 数学原理 对称回文数满足双重条件: 1. 数字本身是回文数:$n = \sum_{i=0}^{k} d_i \times 10^i = \sum_{i=0}^{k} d_i \times 10^{k-i}$ 2. 平方也是回文数:$n^2 = \sum_{j=0}^{m} e_j \times 10^j = \sum_{j=0}^{m} e_j \times 10^{m-j}$ 其中$d_i$和$e_j$分别是$n$和$n^2$的各位数字。 程序通过遍历验证和高效的反转算法,精确找出满足双重对称性的数字。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值