算法入门经典 例题 2-1
题目
输出所有形如 aabb 的 4 位完全平方数(即前两位数字相等,后两位数字也相等)。
解答
这个题目乍一看,有两种思路:
- 列举所有完全平方数,再找其中形如 aabb 的。
- 列举所有形如 aabb 的数,再找其中的完全平方数。
经过我的抉择,我选择了第一种思路
(绝对不是因为我不会判断一个数是否为完全平方数)
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include<iostream> using namespace std;
int main() { for (int i = 1; ; i++) { int allnum = i * i;
if (allnum > 9999) { break; }
int a1 = allnum / 1000; int a2 = allnum / 100 - a1 * 10; int b1 = allnum / 10 - a1 * 100 - a2 * 10; int b2 = allnum / 1 - a1 * 1000 - a2 * 100 - b1 * 10;
if (a1 == a2 && b1 == b2) { cout << allnum << endl; } } return 0; }
|
程序没有问题,但是判断是否为 aabb 的数的过程未免太不优雅了!
所以,我给出了版本 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include<iostream> using namespace std;
int main() { for (int i = 1; ; i++) { int allnum = i * i;
if (allnum > 9999) { break; }
int a1 = allnum / 1000; int a2 = (allnum / 100) % 10; int b1 = (allnum / 10) % 10; int b2 = allnum % 10;
if (a1 == a2 && b1 == b2) { cout << allnum << endl; } } return 0; }
|
这样感觉也挺好。
但是这里有一种更加简洁的写法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <iostream>
int main() { for (int i = 32; i <= 99; ++i) { int num = i * i;
int a1 = num / 1000; int a2 = (num / 100) % 10; int b1 = (num / 10) % 10; int b2 = num % 10;
if (a1 == a2 && b1 == b2) { cout << num << endl; } } return 0; }
|
这里运用了四位数的平方根范围为 32~99 的知识。
但是,我想说:考场上我怎么知道四位数的平方根范围为 32~99???
花絮:一开始看到输出只有 7744 时,我还以为程序写错了,满大街找起来 bug 了 ಠ_ಠ 。
祝各位读者早日成为神牛牪犇!