测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
B71

练习:立方数、角谷猜想、回文数

引入

章前总览 三道练习:枚举判断立方;while 变换验证角谷;取位构造逆序数判回文。

三道练习:

  • 立方数:枚举 i,i*i*i==n
  • 角谷猜想:奇变 3n+1,偶变 n/2
  • 回文数:逆序重建再比较

1 练习1:立方数

判断正整数 n 是否存在正整数 x 使 x³=n。是则 Yes,否则 No。

枚举上界

  • 不必扫到 n:一旦 i*i*i>n 就不可能。
  • 循环条件写成 i*i*i<=n 更稳。
  • 用 flag:找到则 flag=1 再 break。

</> 参考代码

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int flag = 0;
    for (int i = 1; i * i * i <= n; i++) {
        if (i * i * i == n) {
            flag = 1;
            break;
        }
    }
    if (flag) cout << "Yes" << endl;
    else cout << "No" << endl;
    return 0;
}
  • 样例:8 → Yes;9 → No。

2 练习2:角谷猜想

n>1 时:奇数变为 3n+1,偶数变为 n/2;统计变到 1 需要几次。

</> 参考代码

#include <iostream>
using namespace std;

int main() {
    int n, cnt = 0;
    cin >> n;
    while (n > 1) {
        if (n % 2) n = 3 * n + 1;
        else n /= 2;
        cnt++;
    }
    cout << cnt << endl;
    return 0;
}
  • 样例:5 → 5(过程:5→16→8→4→2→1)。
  • 循环条件 n>1,退出时 n 已是 1。

3 练习3:回文数的判定

从左读和从右读相同则为回文数(如 12321、7337)。输出 yes / no。

做法

  • 用临时变量 t 取位(避免破坏原来的 n)。
  • 反复 n1 = n1*10 + t%10; t/=10; 拼出逆序数。
  • 最后比较 n 与 n1 是否相等。

</> 参考代码

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int t = n;
    int n1 = 0;
    while (t > 0) {
        n1 = n1 * 10 + t % 10;
        t = t / 10;
    }
    if (n == n1) cout << "yes" << endl;
    else cout << "no" << endl;
    return 0;
}
  • 样例:159020951 → yes;5556 → no。
小结

三种综合套路:

枚举验证性质(立方 / 完全平方)
while 按规则变换并计数
取位构造新数再比较
里程碑达成:

下一节做第14章基础知识自测。