6
#include <iostream>
#include <cmath>

int main(int argc, const char * argv[])
{    
    for (long i = 1; i > 0; i++) {
        long n = i*i;
        long x = n % 10; 
        long y = n / 10 % 10;

        if (x % 2 != 0 && y % 2 != 0) {
            std::cout << i << std::endl;
            std::cout << n << " " << n % 100 << " " << y << " " << x << std::endl;
            std::cout << "Number Found: " << n << std::endl;
            break;
        }
    }

}

-- RESULT --
3037000501
-9223372030635300615 -15 -1 -5
Number Found: -9223372030635300615

我可能错了,但我相信 long 可能不足以存储答案。有人可以确认该程序运行正常并且长期无法存储该号码,还是我遗漏了什么错误。或者我错过的完全不同的东西。

谢谢

4

5 回答 5

14

我的印象是这个数字不存在。

实际上,您只需要查看,i=50因为i * i % 100它是周期性的,周期正好是 50。因此,数字范围不是您遇到的问题。

所有倒数第二个位置为奇数的完美方格都以6(16、36、196、256、576 等)结尾,这不是奇数。 问题没有解决办法。 没有以两个奇数结尾的完美正方形。

这个循环的原因是任何数字都可以表示为

    n = a * 50 + b  ,  with 0 <= b < 50.  In fact, by definition b = n % 50

接着,

    n^2 % 100 =
    ( a*50 + b )^2 % 100 =
    ( (a*50)^2 + 2*b*a*50 + b^2 ) % 100 =
    ( a*a*2500 + b*a*100 + b^2 ) % 100 =
    b^2 % 100 =
    ( n % 50 )^2 % 100

换句话说, 的最后 2 个数字n^2将与 的相同b^2,其中 0 <= b < 50,具体而言,b = n % 50。

实际上,您甚至不需要达到 49,而只需 25,因为:

    ( 50 - i )^2 % 100 =
    ( 50^2 - 2*50*i + i^2 ) % 100 =
    ( 2500 - 100*i + i^2 ) % 100 =
    i^2 % 100

换句话说

    50^2 %100 = (50- 0)^2 %100 =  0^2 %100 =  0
    49^2 %100 = (50- 1)^2 %100 =  1^2 %100 =  1
    48^2 %100 = (50- 2)^2 %100 =  2^2 %100 =  4
        ...
    27^2 %100 = (50-23)^2 %100 = 23^2 %100 = 29
    26^2 %100 = (50-24)^2 %100 = 24^2 %100 = 76
    25^2 %100 = (50-25)^2 %100 = 25^2 %100 = 25
于 2013-09-03T02:30:40.560 回答
4

从我一直在阅读的内容来看,不可能发生这种情况。这是一个带有证明的雅虎答案:

所以,让我们看一下:显然,个位数符合您的观察 0^2 = 00, 1^2 = 01, 2^2 = 04, 3^2 = 09, 4^2 = 16, 5^2 = 25 , 6^2 = 36, 7^2 =49, 8^2 = 64, 9^2 = 81 所以,在某些情况下,最后两位数都是偶数(尤其是 iof 我们将 0 视为偶数),并且超过 10 ,好吧,12^2 = 144(两个偶数)但是 NONE 有 2 个奇数。

让我们将两位数视为 10x + y,其中 x 和 y 是个位数,则 (10x + y)^2 = 100x^2 + 20xy + y^2 我们可以忽略 100 x^2,因为这只会影响第三位数。为了得到最后一位奇数,我们知道 y^2 必须是奇数 如果 y < 4,则 20 xy 必须是偶数,因为 20 总是偶数,因此 20 xy 必须是偶数。由于所有单个奇数总是给出偶数第二个数字,因此第二个数字必须是偶数。

对于数字中的三位或更多位,我们可以忽略第三位,因为这只会影响倒数第三位。

所以,最后两个数字没有两个奇数的正方形...... :-)

根据该证明,您还可以看到,无论您添加到数字的位数,当平方时,它总是会导致最后 2 位数字中的至少一个为偶数。

于 2013-09-03T02:49:19.193 回答
4

如果ij (mod 100),则i ² ≡ j ² (mod 100),因此后两个值具有相同的底部两位数。因此,您只需要检查 [0, 99] 范围内的整数,并且由于它们的所有平方都在 [0, 9801] 范围内,因此所有内容都将适合普通整数。现在,真的有解决方案吗?如果没有,您的循环将永远运行或直到i * i溢出,触发未定义的行为。

于 2013-09-03T02:32:51.467 回答
1

首先,检查从 0 到 99 的数字就足够了,因为 (100+N)^2 与 N^2 具有相同的最后 2 位数字。

其次,让你的 2 位数字 N 写为 AB,或者换句话说,让 N=10*A+B,其中 A 和 B 是 1 位数字。那么N^2=100*A^2+20*A*B+B^2。第一个两个和显然是偶数,所以你只需要考虑一位数字。

第三,偶数的平方是偶数,因此您只需检查数字 1、3、5、7 和 9。

最后,通过手工对上述五个候选人中的每一个进行平方,您可以轻松地表明所请求的数字不存在。

于 2013-09-03T03:56:25.473 回答
1

没有这样的数字。让我们说这样一个数字存在。然后方格的最后 2 位数字由数字的最后 2 位数字确定。假设最后 2 位数字是 x(第 10 位)和 y(第 1 位)。所以这个数字可以表示为 10x+y。当我们取这个平方时,我们得到 100x.x + y.y+20x.y

(10*x+y)(10*x+y) = 100*x*x + y*y + 20*x*y. 

现在最后一位数字由 y*y 确定。这只有在 y 是奇数时才有可能。最后一位数字由 20*x*y 确定。无论 x 和 y 的值是什么,这始终是偶数。所以所有的方格都排在第 10 位。

于 2013-09-03T15:00:42.943 回答