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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
smoki
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 8
#1

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

24.09.2016, 15:05. Просмотров 251. Ответов 6
Метки нет (Все метки)

Добрый день всем!

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

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; подчеркивая знак умножения (*) и далее во всех строчках, где он присутствует.

Подскажите,пожалуйста, в чем проблема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2016, 15:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как реализовать работу с очень большими числами? (C++):

Способы работы с очень большими числами - C++
Здравствуйте, есть необходимость работать с числами выше 100000000000 но Visual Studio уже начинает выкабеливаться и выдавать данные &quot;в...

Работа с большими числами - C++
Подскажиье, пожалуйста, как работать с большими числами. Допустим у меня есть число...

Работа с очень большими файлами - C++
Читающим этот пост просветления и благ! Не знает ли никто из присутствующих здесь и не будет ли любезен подсказать каким образом можно...

Операции с большими дробными числами - C++
Доброго времени суток! Мне нужно реализовать калькулятор больших(целых и дробных) чисел. Операции: + - * /. Может у кого-то есть...

Работа с большими числами (массивы) - C++
Подскажите плз как мона выполнить умножение и деление чисел с большими значениями хранящихся я так думаю в массивах. пример:...

Операции над большими числами - C++
Здравствуйте. Хочу создать класс выполняющий арифметические операции над большие числа (знаю что велосипед, делаю в учебных целях). Класс...

6
gru74ik
Модератор
Эксперт CЭксперт С++
4168 / 1816 / 198
Регистрация: 20.02.2013
Сообщений: 4,955
Записей в блоге: 21
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;
}
1
smoki
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 8
24.09.2016, 23:23  [ТС] #3
Спасибо! я со слешем точно промахнулся! блин и не видел целый день!
и unsigned long long я попробую сколько по максимуму возьмет. о нем не думал.
0
ValeryS
Модератор
6653 / 5062 / 470
Регистрация: 14.02.2011
Сообщений: 16,929
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
1
smoki
0 / 0 / 0
Регистрация: 14.06.2016
Сообщений: 8
24.09.2016, 23:41  [ТС] #5
Спасибо! Завтра попробую. Если совсем будет никак...напишу.
0
ValeryS
Модератор
6653 / 5062 / 470
Регистрация: 14.02.2011
Сообщений: 16,929
24.09.2016, 23:52 #6
Цитата Сообщение от smoki Посмотреть сообщение
long nums[N];
я так понимаю N размер массива?
слишком большим его делать не стоит
массив размещается в стеке, а стек не безразмерный что то в районе 1 МБайта
выделяй память под массив динамически
но и то с оговорками если 32разрядная ОС то всего на процесс выделяется 4ГБайта под всякие массивы меньше
0
nonedark2008
914 / 653 / 137
Регистрация: 28.07.2012
Сообщений: 1,767
24.09.2016, 23:53 #7
Цитата Сообщение от smoki Посмотреть сообщение
Big<4, 256>
4 бита под экспоненту? Маловато будет...
Цитата Сообщение от smoki Посмотреть сообщение
подчеркивая знак умножения (*)
Все магические константы нужно привести к типу Big, внутри должны быть соответствующие методы.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2016, 23:53
Привет! Вот еще темы с ответами:

Класс для работы с большими числами - C++
Здравствуйте, кто-нибудь уже писал класс для работы с очень большими числами, с поддержкой операторов +-/*, если да то дайте, пожалуйста,...

Функция pow(x,y) не работает с большими числами? - C++
Добрый день Подскажите пожалуйста как решить даную проблему: например pow(111111111, 2) -&gt; -2147483648 Не хотелось бы...

Где почитать о работе с большими числами - C++
Добрый день! Интересует возможность представлять большие числа, то есть такие, которые не помещаются в стандартные типы данных. Где...

Создание класса для оперированием большими числами - C++
Здравствуйте форумчане помогите решить проблему, пытаюсь определить класс для работы с большими числами Написал сам класс (хз правильно...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
24.09.2016, 23:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru