206 Concealed Square

Problem 206

找出唯一一个符合如下条件的数字:它的平方是具有 1_2_3_4_5_6_7_8_9_0 形式的数。每个 _ 都代表了单个数字。

首先,我们对题目给出的形式做一个分析。

平方数最后一个数字是零,那么我们要找的数字(假设是 )最后一位是零。 最后一位是零,那么平方之后的数字末尾有两个零。

所以,问题可以转化为找到一个数字(假设是 ),平方具有1_2_3_4_5_6_7_8_9 的形式。这里的

我们构造一个循环去找这个数。题目中说了,一定存在这样一个数,那么我们从最小可能满足题意的数 100000003 开始计算就好了,不用管循环的上限。

for (long i = 100000003; ; )

再进一步考虑,既然肯定有满足题意的数字,那么平方后第一位肯定是 1。于是,可以粗暴的判定这个数是否符合条件。

string s = (i * i).ToString();
return s[2] == '2' && s[4] == '3' && s[6] == '4' && s[8] == '5' && s[10] == '6' && s[12] == '7' && s[14] == '8';

程序还能进一步优化。

考虑平方数最后一位是 9,只有尾数是 3 或者 7 的数字满足题意。那么,添加一个判断让循环更快:

if (i % 10 == 3)
{
    i += 4;
}
else
{
    i += 6;
}
即每十个数中,我们只需要检查两个数是否满足题意。