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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Работа в excel. срочно http://www.cyberforum.ru/cpp-beginners/thread328355.html
помогите срочно последнее задание по практике Идет k-я секунда суток (размещена в В10). Сколько полных часов h от 0 до 23 (в B11) полных минут m от 0 до 59 (в В12) и секунд s от 0 до 59 (в В13)...
C++ сервер с++ клиент - сервер работают если запушены на одном компе(127.0.0.1) у меня установлена виртуальная машина, попробовал на ней протестить - не соединяются. Virtualbox -> сетевой мост : реальная и... http://www.cyberforum.ru/cpp-beginners/thread328346.html
C++ Добавление и удаление элементов в середину списка
Доброго всем времени суток!! Есть прога добавления и удаления элементов в списке, из начала, конца. А вот с серединой что-то туговато.. Кто подскажет функцию добавления и удаления из середины списка?...
C++ Дан текст. файл, сост. из одной или нескольких строк.подскажите,как написать программу
Дан текст. файл, сост. из одной или нескольких строк. Каждая строка файла содержит числа, разделенные пробелами. Из каждой строки файла удалить числа, предшествующие первому положительному чуслу....
C++ динамический 2-х мерный массив http://www.cyberforum.ru/cpp-beginners/thread328314.html
помогите плиз вот код , нужно составить динамический 2-х мерный массив double **a int n,m,l; scanf("%d%d",&n,&m); a=(double **) colloc (m,sizeof(double*)); for (i=0;i<m;i++) a=(double *)...
C++ Благодаря опережающему объявлению класса можно создать только УКАЗАТЕЛЬ на этот класс; так ли это? class B; class A{ A(); ~A(); B* b; //А вот так не компилится //B b_0; }; подробнее

Показать сообщение отдельно
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
02.07.2011, 13:34
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);     //вернуть сверхбольшое число
  }
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru