очень-очень длинный тип в C ++, могу ли я создать свой собственный очень длинный тип для больших вычислений? - PullRequest
1 голос
/ 27 января 2012

Я покажу вам очень простой пример, очень вызывает факториальный подсчет с рекурсией, но есть одна деталь, которая очень важна, давайте посмотрим на мой код, затем я напишу, в чем моя проблема.

#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 -> 17196083355034583040

С 23 до конца, как я понимаю, в степени "е" есть только числа, как я могу печатать значения из 23 полностью, а не в сокращенном формате?

Спасибо, С наилучшими пожеланиями!

Ответы [ 2 ]

5 голосов
/ 27 января 2012

Вы можете создать свой собственный очень длинный целочисленный тип, используя вектор целых чисел.Но вам нужно реализовать арифметические операции для длинного целого типа, и это, конечно, не тривиально.Лучше использовать большую целочисленную библиотеку, такую ​​как GMP

2 голосов
/ 27 января 2012

Вы получаете переполнение.Вы должны использовать 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
...