简体   繁体   English

在C ++中非常长的类型,我可以为大型计算创建自己的非常长的类型吗?

[英]very-very long type in C++, can I create my own very long type for large calculations?

I shall show you very simple example, very is calling factorial counting with recursion, but there is one detail which is very important, let's look at my code , then I shall write what's my problem. 我将向您展示一个非常简单的示例,非常用递归调用阶乘计数,但是有一个非常重要的细节,让我们看一下我的代码,然后我将写出我的问题。

#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;
    };
};

After this code, I got the next result: http://pastebin.com/ZHPtJBZ7 经过这段代码,我得到了下一个结果: http : //pastebin.com/ZHPtJBZ7

The max result, which is readable is: 22 -> 17196083355034583040 可读的最大结果为:22-> 17196083355034583040

From 23 till end , as I understand, there are only numbers in "e" power, how can I print values from 23 fully, not in shorten format? 据我了解,从23到末尾,只有“ e”幂的数字,我怎么能完整打印23中的值而不是短格式?

Thanks, Best Regards! 谢谢,最好的问候!

You can create your own very long integer type using a vector of integers. 您可以使用整数向量创建自己的非常长的整数类型。 But you'd need to implement the arithmetic operations for your long integer type, and this is certainly not trivial to pull off. 但是,您需要为长整数类型实现算术运算,这当然并非易事。 It's better to use a big-integer library, like GMP 最好使用像GMP这样的大整数库

You are getting overflow. 您正在溢出。 You should use libgmp. 您应该使用libgmp。

Edit: Your code using GMP: 编辑:您的代码使用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;
    };
};

Result: 结果:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM