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

Как сделать свою переменну в С++ - C++

Восстановить пароль Регистрация
 
Wahlberg
 Аватар для Wahlberg
70 / 70 / 2
Регистрация: 26.11.2010
Сообщений: 371
01.07.2011, 00:33     Как сделать свою переменну в С++ #1
Мне нужно подсчитывать очень большие числа, порядка 10^100000, и нужно создать свою переменную как можно это сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Koste
 Аватар для Koste
26 / 26 / 0
Регистрация: 04.03.2011
Сообщений: 164
01.07.2011, 00:39     Как сделать свою переменну в С++ #2
Библиотеки больших чисел, не катят?
студентик
 Аватар для студентик
0 / 0 / 0
Регистрация: 11.04.2011
Сообщений: 13
01.07.2011, 01:37     Как сделать свою переменну в С++ #3
попробуй записать данное число используя динамические структуры данных.
Напр: стеки, очереди.
Данное число можешь записывать в стек разбивая его на разряды.
А по переменной ничем не помогу.
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
01.07.2011, 01:43     Как сделать свою переменну в С++ #4
тут нужно использовать длинную арифметику... или Big Integer library of Boost

Добавлено через 5 минут
студентик, сомневаюсь, что Ваш вариант работы с большими числами будет удачен и производителен ( не видел реализации, и не пробовал таким методом ) и будет ли он вообще работать, если говорить о большем, чем хранении большого числа в памяти - умножение больших чисел, сложение, деление etc...
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
01.07.2011, 01:54     Как сделать свою переменну в С++ #5
Mиxaил, будет, а почему нет-то.
обычно так и делают вообще-то
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.07.2011, 02:26     Как сделать свою переменну в С++ #6
Цитата Сообщение от sandye51 Посмотреть сообщение
обычно так и делают вообще-то
делают, но через структуры данных с произвольным доступом, а не

Цитата Сообщение от студентик Посмотреть сообщение
стеки, очереди.
Wahlberg
 Аватар для Wahlberg
70 / 70 / 2
Регистрация: 26.11.2010
Сообщений: 371
01.07.2011, 21:13  [ТС]     Как сделать свою переменну в С++ #7
Ну как сделать-то?)(
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.07.2011, 21:19     Как сделать свою переменну в С++ #8

Не по теме:

Ради таких случаев я освоил это =)

Java
1
2
3
4
Scanner i = new Scanner(new File("input.txt"));
PrintWriter o = new PrintWriter(new File("output.txt"));
java.math.BigInteger a = i.nextBigInteger(), b = i.nextBigInteger();
o.print(a.multiply(b));


Либо использовать буст
Или вот, как вариант.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.07.2011, 22:56     Как сделать свою переменну в С++ #9
Или вот я попробовал сегодня GMP.
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
02.07.2011, 13:34     Как сделать свою переменну в С++ #10
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
#include <iostream>
#include <string.h>            //для strlen()и т. п.
#include <stdlib.h>            //для ltoa()
using namespace std;
 
const int SZ = 1000;           //максимальное число разрядов
 
class verylong
  {
  private:
    char vlstr[SZ];            //число как строка
    int vlen;                  //длина строки verylong
    verylong multdigit(const int) const; //прототипы
    verylong mult10(const verylong) const;// скрытых
                                          // функций
  public:
    verylong() : vlen(0)       //конструктор без аргументов
      { vlstr[0]='\0'; }
    verylong(const char s[SZ]) //конструктор (1 аргумент)
      { strcpy(vlstr, s); vlen=strlen(s); } //для строки
    verylong(const unsigned long n) //конструктор (1 арг.)
      {                             //для long int
      ltoa(n, vlstr, 10);           //перевести в строку
      strrev(vlstr);                //перевернуть ее
      vlen=strlen(vlstr);           //найти длину
      } 
    void putvl() const;              //вывести число
    void getvl();       //получить число от пользователя
    verylong operator + (const verylong); //сложить числа
    verylong operator * (const verylong); //умножить
  };
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "verylong.h"        //заголовочный файл для verylong
//---------------------------------------------------------
void verylong::putvl() const //вывод на экран verylong
  {
  char temp[SZ];
  strcpy(temp,vlstr);        //создать копию
  cout << strrev(temp);      //перевернуть копию
  }                          //и вывести ее
//---------------------------------------------------------
void verylong::getvl()       //получить сверхбольшое число от
                             //пользователя
  {
  cin >> vlstr;              //получить строку от пользователя
  vlen = strlen(vlstr);      //найти ее длину
  strrev(vlstr);             //перевернуть ее
  }
//---------------------------------------------------------
verylong verylong::operator + (const verylong v)
                             //сложение
  {
  char temp[SZ];
  int j;
                             //найти самое длинное число
  int maxlen = (vlen > v.vlen) ? vlen : v.vlen;
  int carry = 0;             //установить в 1, если сумма >= 10
  for(j = 0; j<maxlen; j++)  //и так для каждой позиции
    {
    int d1 = (j > vlen-1)  ? 0 : vlstr[j]-'0';    //получить
                                                  //разряд
    int d2 = (j > v.vlen-1) ? 0 : v.vlstr[j]-'0'; //и еще
    int digitsum = d1 + d2 + carry;  //сложить разряды
    if( digitsum >= 10 )             //если перенос, то
      { digitsum -= 10; carry=1; }   //увеличить сумму на 10
    else                     //установить перенос в 1
      carry = 0;             //иначе перенос = 0
    temp[j] = digitsum+'0';  //вставить символ в строку
    }
  if(carry==1)               //если перенос в конце,
    temp[j++] = '1';         //последняя цифра = 1
  temp[j] = '\0';            //поставить ограничитель строки
  return verylong(temp);     //вернуть временный verylong
  }
//---------------------------------------------------------
verylong verylong::operator * (const verylong v)//умножение
  {                                             //сверхбольших чисел
  verylong pprod;            //произведение одного разряда
  verylong tempsum;          //текущая сумма
  for(int j=0; j<v.vlen; j++)//для каждого разряда аргумента
    {
    int digit = v.vlstr[j]-'0'; //получить разряд
    pprod = multdigit(digit);   //умножить текущий на него
    for(int k=0; k<j; k++)      //умножить результат на
      pprod = mult10(pprod);    //  степень 10-ти
    tempsum = tempsum + pprod;  //прибавить произведение к
                                //текущей сумме
    }
  return tempsum;               //вернуть полученную текущую сумму
  }
//---------------------------------------------------------
verylong verylong::mult10(const verylong v) const //умножение аргумента 
                                                  //на 10
  {                
  char temp[SZ];
  for(int j=v.vlen-1; j>=0; j--)//сдвинуться на один разряд
    temp[j+1] = v.vlstr[j];     //выше
  temp[0] = '0';                //обнулить самый младший разряд
  temp[v.vlen+1] = '\0';        //поставить ограничитель строки
  return verylong(temp);        //вернуть результат
  }
//---------------------------------------------------------
verylong verylong::multdigit(const int d2) const
  {                          //умножение числа на
  char temp[SZ];             //аргумент (цифру)
  int j, carry = 0;
  for(j = 0; j<vlen; j++)    //для каждого разряда
    {              //  в этом сверхбольшом
    int d1 = vlstr[j]-'0';   //получить значение разряда
    int digitprod = d1 * d2; //умножить на цифру
    digitprod += carry;      //добавить старый перенос
    if( digitprod >= 10 )    //если возник новый перенос,
      {
      carry = digitprod/10;  //переносу присвоить //значение старшего разряда
      digitprod -= carry*10; //результату - младшего
      }
    else
      carry = 0;             //иначе перенос = 0
    temp[j] = digitprod+'0'; //вставить символ в строку
    }
  if(carry != 0)             //если на конце перенос,
    temp[j++] = carry+'0';   //это последний разряд
  temp[j] = '\0';            //поставить ограничитель
  return verylong(temp);     //вернуть сверхбольшое число
  }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2011, 14:33     Как сделать свою переменну в С++
Еще ссылки по теме:

Хочу сделать свою 3D игру (работа с текстурами и 3D моделями) C++
C++ Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Хочу попробовать сделать свою регистрацию C++

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

Или воспользуйтесь поиском по форуму:
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
02.07.2011, 14:33     Как сделать свою переменну в С++ #11
Обычно в таких случаях используют большой-большой массив
Yandex
Объявления
02.07.2011, 14:33     Как сделать свою переменну в С++
Ответ Создать тему
Опции темы

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