题目
输出所有形如 aabb 的 4 位完全平方数(即前两位数字相等,后两位数字也相等)。
解答
这个题目乍一看,有两种思路:
- 列举所有完全平方数,再找其中形如 aabb 的。
- 列举所有形如 aabb 的数,再找其中的完全平方数。
经过我的抉择,我选择了第一种思路
(绝对不是因为我不会判断一个数是否为完全平方数)
解答
#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:
#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;
}
这样感觉也挺好。
但是这里有一种更加简洁的写法:
#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 了 ಠ_ಠ 。
祝各位读者早日成为神牛牪犇!