题目

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

解答

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

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

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