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章基础知识自测。