Форум программистов, компьютерный форум CyberForum.ru

Как реализовать работу с очень большими числами? - C++

Восстановить пароль Регистрация
 
smoki
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 8
24.09.2016, 15:05     Как реализовать работу с очень большими числами? #1
Добрый день всем!

Очень необходимы светлые мозги, ибо не могу понять в чем проблема.
Есть работающая программа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <conio.h>
#include <stdio.h>
#define N 100
#define start 1
using namespace std;
 
void main()
{
    system("cls");
    long int a1,a2;
    long int res1,res2;
    long int c1,c2;
    a1=start;
    a2=a1+N;
    res1=(a2+2)/5;
    res2=(a2+4)/6;
    
    long i,j,q,z,z1,z2,r,g,a;
    long nums[N];
 
    for (i=start; i<(start + N); i++)
    {
        nums[i-start+1]=10*i+8;
    }
    for (i=1; i<N; i++)
    {
        for (q=1;q<=res1;q++)
        {
            c2=(a2+q+2)/(10*q-8);
            c1=(a1+q+2)/(10*q-8)+1;
 
            for (g=c1;g<c2;g++)
            {
                z=(10*q+8)*g-(q-2);
                if ((z-start+1)<N)
                    nums[z-start+1]=0;
                else 
                    break;
            }
        }
        for (q=1;q<=res2;q++)//3
        {
            c2=(a2+q)/(10*q-6);
            c1=(a1+q)/(10*q-6)+1;
            for (g=c1;g<=c2;g++)
            {
                z=(10*q-6)*g+q;
                if ((z-start+1)<N)
                    nums[z-start+1]=0;
                else 
                    break;
            }
        }
 
    }
    for (i=1;i<N;i++)
    {
        printf("%1d element = %1d\n",i,nums[i]);
    }
    getch();
}
но максимальное N в #define N задается что-то с 9 нулями. Хочу взять больше. Подключаю мат.библиотеку и пробую переписать прогу так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "ttmath\ttmath.h"
#include <iostream>//7 proverka proshla
#include <conio.h>
#include <stdio.h>
using namespace std;
using namespace ttmath;
#define N 100
#define start 1
 
typedef Big<4, 256> BigNum; 
 
void main()
{
    system("cls");
    BigNum a1,a2;
    BigNum res1,res2;
    BigNum c1,c2;
    a1=start;
    a2=a1+N;
    res1=(a2+2)/5;
    res2=(a2+4)/6;
    
    BigNum i,j,q,z,z1,z2,r,g,a;
    BigNum nums[N];
 
    for (i=start; i<(start + N); i++)
    {
        nums[i-start+1]=10*i+8;
    }
    for (i=1; i<N; i++)
    {
        for (q=1;q<=res1;q++)
        {
            c2=(a2+q+2)/(10*q-8);
            c1=(a1+q+2)/(10*q-8)+1;
 
            for (g=c1;g<c2;g++)
            {
                z=(10*q+8)*g-(q-2);
                if ((z-start+1)<N)
                    nums[z-start+1]=0;
                else 
                    break;
            }
        }
        for (q=1;q<=res2;q++)
        {
            c2=(a2+q)/(10*q-6);
            c1=(a1+q)/(10*q-6)+1;
            for (g=c1;g<=c2;g++)
            {
                z=(10*q-6)*g+q;
                if ((z-start+1)<N)
                    nums[z-start+1]=0;
                else 
                    break;
            }
        }
 
    }
    for (i=1;i<N;i++)
    {
        printf("%1d element = %1d\n",i,nums[i]);
    }
    getch();
}
Пограма начинает ругаться уже на строке nums[i-start+1]=10*i+8; подчеркивая знак умножения (*) и далее во всех строчках, где он присутствует.

Подскажите,пожалуйста, в чем проблема.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gru74ik
Модератор
 Аватар для gru74ik
3000 / 1313 / 164
Регистрация: 20.02.2013
Сообщений: 3,739
Записей в блоге: 15
24.09.2016, 19:00     Как реализовать работу с очень большими числами? #2
Цитата Сообщение от smoki Посмотреть сообщение
максимальное N в #define N задается что-то с 9 нулями. Хочу взять больше.
Стандартными средствами - никак. Подключайте сторонние библиотеки. Boost.Multiprecision, например.

Добавлено через 3 минуты
smoki, ага, Вы так и сделали (подключили ttmath). Прошу прощения, сразу не заметил.

Добавлено через 6 минут
smoki, а простейшие примеры с сайта библиотеки у Вас компилируются?

Добавлено через 7 минут
smoki, Вы слэш не туда завернули. У Вас так:
C++
1
#include <ttmath\ttmath.h>
А надо так:
C++
1
#include <ttmath/ttmath.h>
Добавлено через 11 минут
smoki, и пишет он Вам ошибки, потому что операция [] не перегружена для типа Big. А Вам точно типа unsigned long long не хватит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <cstdio>
#include <cstdlib>
 
int main()
{
    const int N = 100;
    const int start = 1;
 
    typedef unsigned long long BigNum;
 
    system("cls");
    BigNum a1,a2;
    BigNum res1,res2;
    BigNum c1,c2;
    a1=start;
    a2=a1+N;
    res1=(a2+2)/5;
    res2=(a2+4)/6;
 
    BigNum i,j,q,z,z1,z2,r,g,a;
    BigNum nums[N];
 
    for (i=start; i<(start + N); i++)
    {
        nums[i-start+1]=10*i+8;
    }
    for (i=1; i<N; i++)
    {
        for (q=1;q<=res1;q++)
        {
            c2=(a2+q+2)/(10*q-8);
            c1=(a1+q+2)/(10*q-8)+1;
 
            for (g=c1;g<c2;g++)
            {
                z=(10*q+8)*g-(q-2);
                if ((z-start+1)<N)
                    nums[z-start+1]=0;
                else
                    break;
            }
        }
        for (q=1;q<=res2;q++)
        {
            c2=(a2+q)/(10*q-6);
            c1=(a1+q)/(10*q-6)+1;
            for (g=c1;g<=c2;g++)
            {
                z=(10*q-6)*g+q;
                if ((z-start+1)<N)
                    nums[z-start+1]=0;
                else
                    break;
            }
        }
 
    }
    for (i=1;i<N;i++)
    {
        printf("%1d element = %1d\n",i,nums[i]);
    }
 
    return 0;
}
smoki
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 8
24.09.2016, 23:23  [ТС]     Как реализовать работу с очень большими числами? #3
Спасибо! я со слешем точно промахнулся! блин и не видел целый день!
и unsigned long long я попробую сколько по максимуму возьмет. о нем не думал.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
24.09.2016, 23:37     Как реализовать работу с очень большими числами? #4
Цитата Сообщение от gru74ik Посмотреть сообщение
Стандартными средствами - никак.
как это ? а unsigned long long int 18 нулей, впрочем об этом уже написал
Цитата Сообщение от gru74ik Посмотреть сообщение
unsigned long long
Цитата Сообщение от smoki Посмотреть сообщение
но максимальное N в #define N задается что-то с 9 нулями.
добавь буковки ULL(Unsgned Long Long)

Добавлено через 53 секунды
Цитата Сообщение от smoki Посмотреть сообщение
unsigned long long я попробую сколько по максимуму возьмет.
4611686018427387903
smoki
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 8
24.09.2016, 23:41  [ТС]     Как реализовать работу с очень большими числами? #5
Спасибо! Завтра попробую. Если совсем будет никак...напишу.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
24.09.2016, 23:52     Как реализовать работу с очень большими числами? #6
Цитата Сообщение от smoki Посмотреть сообщение
long nums[N];
я так понимаю N размер массива?
слишком большим его делать не стоит
массив размещается в стеке, а стек не безразмерный что то в районе 1 МБайта
выделяй память под массив динамически
но и то с оговорками если 32разрядная ОС то всего на процесс выделяется 4ГБайта под всякие массивы меньше
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2016, 23:53     Как реализовать работу с очень большими числами?
Еще ссылки по теме:

Есть ли библиотеки для работы с большими числами C++
Операции с большими дробными числами C++
Операции над большими числами C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
nonedark2008
623 / 501 / 92
Регистрация: 28.07.2012
Сообщений: 1,338
24.09.2016, 23:53     Как реализовать работу с очень большими числами? #7
Цитата Сообщение от smoki Посмотреть сообщение
Big<4, 256>
4 бита под экспоненту? Маловато будет...
Цитата Сообщение от smoki Посмотреть сообщение
подчеркивая знак умножения (*)
Все магические константы нужно привести к типу Big, внутри должны быть соответствующие методы.
Yandex
Объявления
24.09.2016, 23:53     Как реализовать работу с очень большими числами?
Ответ Создать тему
Опции темы

Текущее время: 10:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru