算法入门经典 例题 2-1

题目

输出所有形如 aabb 的 4 位完全平方数(即前两位数字相等,后两位数字也相等)。

解答

这个题目乍一看,有两种思路:

  1. 列举所有完全平方数,再找其中形如 aabb 的。
  2. 列举所有形如 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 了 ಠ_ಠ 。

祝各位读者早日成为神牛牪犇!