これは、Project Euler サイトの問題 3です。
私は解決策を求めているわけではありませんが、おそらく私のアプローチが何であるかを知っていると思います. 私の質問に対して、 unsigned int を超える数値をどのように処理しますか?
これに対する数学的アプローチはありますか?もしそうなら、どこでそれについて読むことができますか?
あなたは試しましたunsigned long long
か、それとももっと良い/具体的にuint64_t
は?
uint64_t
[2 64 -1] [64 ビット整数、符号なし]の範囲より大きい数値を処理したい場合は、bignum を調べる必要があります: http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic。
600,851,475,143 は質問によって与えられた数であり、2 64 -1 は 18,446,744,073,709,551,615 に等しくなります。それは間違いなく十分な大きさです。
最近素因数分解を知っている子供に教えたところ、素数のリストがあればアルゴリズムは自明です。
def factor(n):
"""returns a list of the prime factors of n"""
factors = []
p = primes.generator()
while n > 1:
x = p.next()
while n % x == 0:
n = n / x
factors.append(x)
return factors
を連続して呼び出すとp.next()
、一連の素数 {2, 3, 5, 7, 11, ...} の次の値が得られます。その疑似コードが実際に動作する Python コードに似ているのは、まったくの偶然です。primes.generator()
の定義が 1 行短い (ただし、1 行の長さは 50 文字です)ことは、おそらく言うべきではありません。GNU プログラムは log 2 ( n ) >= 40のfactor
入力を受け入れないため、私が最初にこの「コード」を書きました。
Windows では、コンパイラが 64 ビット整数をサポートしていない場合、LARGE_INTEGERとULARGE_INTEGERを使用できます。
使用する
long long
GCCで
と
__int64
VCで
使用する
long long
これは、GCC と新しいバージョンの Visual Studio (2008 以降と思われます) の両方でサポートされています。
おそらく、問題を処理する最も簡単な方法は、Python を使用することです。Python バージョン > 2.5 では、組み込みの長精度算術演算がサポートされています。精度は、コンピューターのメモリにのみ依存します。詳細については、このリンクを参照してください。
long long
その問題のためにそれを行います。を超える他の Project Euler の問題についてlong long
は、おそらくlibgmp (特にそのC++ ラッパー クラス) を使用します。