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

私は間違っているかもしれませんが、答えを格納するのに十分な大きさではない可能性があると思います。プログラムが正常に動作していて、長い間番号を保存できないことを誰かが確認できますか、それとも私が見逃している何か問題がありますか? または、私が見逃したまったく別の何か。

ありがとう

4

5 に答える 5

14

その数は存在しないというのが私の印象です。

事実上、正確に 50 の周期で循環するi=50ため、参照する必要があるだけです。したがって、数値の範囲は発生している問題ではありません。i * i % 100

最後から2番目の位置に奇数の数字があるすべての完全な正方形は、6(16、36、196、256、576など)で終わりますが、これは奇数ではありません。 問題には解決策がありません。 2 つの奇数桁で終わる完全な正方形はありません。

このサイクルの理由は、任意の数値を次のように表すことができるためです。

    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

ij (mod 100) の場合、i ²j ² (mod 100) となるため、後者の 2 つの値は下 2 桁が同じになります。したがって、範囲 [0, 99] の整数のみをチェックする必要があり、それらのすべての平方は範囲 [0, 9801] にあるため、すべてが通常の整数に快適に収まります。さて、実際に解決策はありますか?そうでない場合、ループは永久に、またはi * iオーバーフローするまで実行され続け、未定義の動作がトリガーされます。

于 2013-09-03T02:32:51.467 に答える
4

私が読んだ限りでは、そのような出来事はあり得ません。ここに証明付きのyahooの回答があります:

それでは、それを見てみましょう: 明らかに、1 桁はあなたの観察に適合します 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 したがって、最後の 2 桁が両方とも偶数である場合 (特に、0 を偶数としてカウントする場合) と、10 を超える場合があります。 、まあ、12^2 = 144 (2 桁の偶数) しかし、2 桁の奇数では NONE です。

2 桁の数を 10x + y と考えてみましょう。x と y は 1 桁で、(10x + y)^2 = 100x^2 + 20xy + y^2 となります。100 x^2 は無視できます。 3桁目に影響します。奇数の最後の桁を取得するには、y^2 が奇数でなければならないことがわかっています。y < 4 の場合、20 は常に偶数であるため、20 xy は偶数でなければならず、したがって 20 xy は偶数でなければなりません。すべての 1 つの奇数桁は常に偶数の 2 番目の桁になるため、2 番目の桁は偶数でなければなりません。

数字が 3 桁以上の場合、3 桁目は無視できます。これは、最後の 3 桁目にのみ影響するためです。

したがって、最後の 2 つの数字として 2 つの奇数桁を持つ正方形はありません.... :-)

その証明に続いて、数値に追加する桁数に関係なく、2 乗すると常に下 2 桁の少なくとも 1 桁が偶数になることがわかります。

于 2013-09-03T02:49:19.193 に答える
1

そのような数はありません。そのような数が存在するとしましょう。次に、正方形の下 2 桁は、数字の下 2 桁によって決定されます。下2桁をx(10位)とy(1位)とする。したがって、数値は 10x+y として表すことができます。これを 2 乗すると、100x.x + y.y+20x.y になります。

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

最後の桁は y*y で決まります。これは、y が奇数の場合にのみ可能です。最後の 2 桁目は 20*x*y によって決定されます。x と y の値が何であれ、これは常に偶数です。したがって、すべての正方形が 10 位になります。

于 2013-09-03T15:00:42.943 に答える