2012-01-26 9 views
1

私はあなたに非常に簡単な例を示します、非常に再帰で階乗カウントを呼び出していますが、非常に重要な一つの細部があります、私のコードを見てみましょう、次に私は何か問題を書くでしょう。このコードの後C++の非常に長い型の場合、大きな計算のために自分の非常に長い型を作成できますか?

#define PASSWORD_MAX 0x28 

typedef unsigned long long longtype; 

#include <iostream> 

using namespace std; 


longtype f(longtype n) 
{ 
    return (n <= 1) ? 1 : f(n - 1) * n; 
}; 

void main(void) 
{ 
    for(longtype i = 0; i <= PASSWORD_MAX; i++) 
    { 
     if(f(i) != 0) cout << i << " -> " << f(i) << endl; 
    }; 
}; 

、私は次の結果得た:http://pastebin.com/ZHPtJBZ7

が読み取り可能な最大の結果は、次のとおりです。22 - 私は理解しているように、最後まで23から> 17196083355034583040

があります"e"パワーの数字だけです。形式を短くするのではなく、23から値を完全に印刷するにはどうしたらいいですか?

ありがとう、よろしく!

答えて

2

オーバーフローしています。 libgmpを使うべきです。

編集:GMPを使用してコード:

#include <gmpxx.h> 

#define PASSWORD_MAX 0x28 

typedef mpz_class longtype; 

#include <iostream> 

using namespace std; 


longtype f(longtype n) 
{ 
    return (n <= 1) ? longtype(1) : f(n - 1) * n; 
}; 

int main(void) 
{ 
    for(i = 0; i <= PASSWORD_MAX; i++) 
    { 
     if(f(i) != 0) cout << i << " -> " << f(i) << endl; 
    }; 
}; 

結果:

0 -> 1 
1 -> 1 
2 -> 2 
3 -> 6 
4 -> 24 
5 -> 120 
6 -> 720 
7 -> 5040 
8 -> 40320 
9 -> 362880 
10 -> 3628800 
11 -> 39916800 
12 -> 479001600 
13 -> 6227020800 
14 -> 87178291200 
15 -> 1307674368000 
16 -> 20922789888000 
17 -> 355687428096000 
18 -> 6402373705728000 
19 -> 121645100408832000 
20 -> 2432902008176640000 
21 -> 51090942171709440000 
22 -> 1124000727777607680000 
23 -> 25852016738884976640000 
24 -> 620448401733239439360000 
25 -> 15511210043330985984000000 
26 -> 403291461126605635584000000 
27 -> 10888869450418352160768000000 
28 -> 304888344611713860501504000000 
29 -> 8841761993739701954543616000000 
30 -> 265252859812191058636308480000000 
31 -> 8222838654177922817725562880000000 
32 -> 263130836933693530167218012160000000 
33 -> 8683317618811886495518194401280000000 
34 -> 295232799039604140847618609643520000000 
35 -> 10333147966386144929666651337523200000000 
36 -> 371993326789901217467999448150835200000000 
37 -> 13763753091226345046315979581580902400000000 
38 -> 523022617466601111760007224100074291200000000 
39 -> 20397882081197443358640281739902897356800000000 
40 -> 815915283247897734345611269596115894272000000000 
5

あなたが整数のベクトルを使用して、独自の非常に長い整数型を作成することができます。しかし、あなたは長整数型の算術演算を実装する必要がありますが、これは決して簡単ではありません。 GMP

のような大きな整数のライブラリを使用する方がよいでしょう。
関連する問題