1. 示例回文数
例如寻找并输出11~999之间的数m,它满足m、m2和m3均为回文数Palindrome 。回文:各位数字左右对称的整数。
2. 实现分析
isPalin函数
判断一个整数是否是回文数,将数字反转并与原始数字比较确定
主程序逻辑
从 11 遍历到 999,计算每个数的平方和立方
对每个数 m,调用 isPalin 来判断 m、m² 和 m³ 是否都是回文数
如果满足条件,输出该数及其平方和立方
#include <iostream>
using namespace std;
//判断是否为回文数
bool isPalin(int num)
{
int reversed = 0, original = num;
//反转数字
while (num > 0)
{
reversed = reversed * 10 + num % 10;
num /= 10;
}
//判断反转后的数与原始数是否相同
return original == reversed;
}
int main()
{
int m;
//遍历11到999之间的数
for (m = 11; m <= 999; m++)
{
//检查m,m2,m3是否均为回文数
if (isPalin(m) && isPalin(m * m) && isPalin(m * m * m))
{
cout << "\nm = " << m << endl;
cout << "m^2 = " << m * m << endl;
cout << "m^3 = " << m * m * m << endl;
}
}
return 0;
}
3. 反转数字的核心逻辑
num % 10,
获取当前数字的最后一位, 如果 num = 189,那么 189 % 10 = 9
reversed * 10 + num % 10
提取的数字( num % 10)加到 reversed 的末尾,构成反转的过程
在 reversed 中存储了已经反转过的数字,所以每次将新的一位数字加到反转数的末尾时,先将 reversed 扩大10倍,这样新数字才能加到最末位,例如,假设 reversed = 12,我们再加上新的一位数字 3,先把 12 变为 120,然后再加上 3,变为 123
num /= 10
去掉已经处理过的数字,将 num 右移一位
例如,如果 num = 1234,执行 num /= 10 后,num 将变为 123
在前面进制转换我们也看到过这些用法
该过程完整的循环例子
假设想反转数字749
初始
num = 749,reversed = 0
第 1 次循环
提取,num%10, 749%10=9;
更新reversed, reversed = 0*10 +9 = 9
更新num, num= 749 /10 =74
第 2 次循环
提取,num%10, 74 % 10 = 4;
更新reversed, reversed = 9 *10 + 4 = 94
更新num, num= 74 /10 =7
第 3 次循环
提取,num%10, 7 % 10 = 7;
更新reversed, reversed = 94 *10 + 7 = 947
更新num, num= 7 /10 = 0
num 变成了 0,while 循环结束,此时 reversed 的值为 947,即为 749 的反转数
完成数字反转后,就可以将 reversed 与原始的 num 进行比较