2017-04-16 1 views
-3

Iは1から111111までのすべての自己同形数(例えば = 2 としてのそれらの正方形の最終桁に繰り返される数字、76x76 = 57 )を見つけるためにC++プログラムを書かれています。プログラムは、それが90625と109376.にコードを与えるために失敗したことを除いて正常に動作は次のとおりです。私のコードで最後の2つの数字が得られないのはなぜですか?

#include <cstdlib> 
#include <iostream> 

using namespace std; 

int main() { 

    long int square; 
    int a, sum = 0, result, b; 

    for (int i = 1; i < 111111; i++) { 
    result = 1; 
    b = i; 

    while (b > 0){ 
     b = b/10; 
     result = result * 10; 
    } 

    square = i * i; 

    a = square % result; 

    if(i == a){ 
     sum = sum + i; 
     cout << i << endl; 
    } 
    } 

    cout << sum << endl; 

    return 0; 
} 
+0

...コードを読み込み可能にフォーマットする –

+0

たとえば、90625だけをテストし、各計算の前後にログを記録するようにコードを修正できます。 –

+0

また、2つの 'int'を' long int'に掛けた結果を格納するポイントは何ですか? –

答えて

1

long int型のみ4バイト

long 4 bytes -2,147,483,648 to 2,147,483,647 
unsigned long 4 bytes 0 to 4,294,967,295 

90625と109376の正方形は8212890625ですし、それぞれ、11,963,109,376、である。したがって、値がオーバーフローすると、long int limitで2つの値を生成できなくなります。整数型long longを使用できます。

long long 8 bytes –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 
unsigned long long 8 bytes 0 to 18,446,744,073,709,551,615 

そして、あなたはより多くを処理するためにGMPのようなライブラリを使用すると、Arraysを使用してそれらを扱うことができるより大きな数字を使用するかようにしたい場合。

関連する問題