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

Сложение столбиком. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как перевести убывающий цикл из паскаля в C++? http://www.cyberforum.ru/cpp-beginners/thread286226.html
Не могу понять как перевести строчку кода из Pascal на C++. Подскажите пожалуйста For j:=n Downto (i+1) Do
C++ Подскажите, как считать из файла структуру Только начали работу с файлами на С. Поэтому пока что не совсем разобралась, что и куда. Struct notebook { char model; //наименование struct size { //габаритные размеры float x; float y; float z; }; float w; //вес http://www.cyberforum.ru/cpp-beginners/thread286225.html
C++ как записать в переменную символьного типа (думерный массив) несколько строк, после инициализации этой переменной?
как записать в переменную символьного типа (думерный массив) несколько строк, после инициализации этой переменной? тоесть при инициализации канает char a={"dfbsdb","dfvsdfv"} а если после инициализации записать, a={"dfbsdb","dfvsdfv"} то выдаёт ошибку! или я мб нетак записываю? подскажите в чём ошибка!!
C++ Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0]
Задан массив из 3 указателей Bitmap, по адресу Bitmap необходимо записать 480*640 элементов из массива Bitmap. В последнем цикле for выдает ошибку при i=2: Необработанное исключение в "0x004139be" в "Blue.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc". int i=0; BYTE* Bitmap; //Выделяем память for (i=0; i<=2; Bitmap=(BYTE *)malloc(480*640*sizeof(BYTE)));
C++ Численное интегрирование(ошибка при расчете) http://www.cyberforum.ru/cpp-beginners/thread286174.html
Прога считает определенные интеграл на заданном отрезке. Пользователь вводит начало и конец отрезка (я ввожу 0.1 и 0.6 соответственно в связи с особенностью интегрирования функции), ну и понеслась. Ошибка возникает в 46 строчке при расчете I. Трейсил прогу, выяснил, что значение y почему то равно -9.2559631349317831e+061, хотя при заполнении массива y значение присваивается вполне нормально......
C++ Модульность программы Здравствуйте. У меня вопрос фундаментального характера, но что-то он у меня вызывал трудность. У меня есть приложение, которое выполняет некоторые действия: 1. Принятие данных из сети, 2. Обработка принятых данных, 3. Запись лога выполненых действий. Сейчас у меня все эти действия выполняются в одном исполняемом файле (.exe) подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт С++
1035 / 814 / 48
Регистрация: 30.04.2011
Сообщений: 1,658
03.05.2011, 12:03     Сложение столбиком.
Все гораздо проще можно сделать:

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
Листинг 11.17. Класс «длинных» целых чисел
class LongLong
{   public:
    // Конструкторы
    LongLong(const string &s);          // инициализация строкой
    LongLong(const long &number=0);
// операции c с присваиванием
    LongLong& operator+=(const LongLong &r);
    LongLong& operator-=(const LongLong &r);
    LongLong& operator*=(const LongLong &r);
    LongLong& operator/=(const LongLong &r);
    LongLong& operator%=(const LongLong &r);
// операции без присваивания
    friend LongLong operator+(const LongLong &l, const LongLong &r);
    friend LongLong operator-(const LongLong &l, const LongLong &r);
    friend LongLong operator*(const LongLong &l, const LongLong &r);
    friend LongLong operator/(const LongLong &l, const LongLong &r);
    friend LongLong operator%(const LongLong &l, const LongLong &r);
// ввод – вывод
    friend istream& operator>>(istream &is, LongLong &r);
    friend ostream& operator<<(ostream &os, const LongLong &r);
private:
    vector<char> v;
};
Помимо приведенных дружественных операций можно добавить еще операции длинных чисел с целыми, например
C++
1
2
friend LongLong operator+(const LongLong &l, const long &r);
friend LongLong operator+(const long &l, const LongLong &r);
Само число находится в поле-контейнере. Каждая цифра — это один элемент вектора, младшая цифра расположена в контейнере по младшему индексу. Например, число 765 будет расположено так: v[0]=5,v[1]=6,v[2]=7.
Конструкторов всего два: конструктор копирования создается автоматически, а конструктор без аргументов нам просто не нужен, так как в конструкторе инициализации задан аргумент по умолчанию. Реализацию покажем на примере конструктора с аргументом-целым (листинг 11.18).
C++
1
2
3
4
5
6
7
8
9
10
Листинг 11.18. Конструктор инициализации длинного целого
LongLong::LongLong(const long &number)
{  long t = number, i = 0; 
   char digit;
   while(t>0)
   { digit = t % 10;
     v.push_back(digit);
     t/=10; i++;
   }
}
Операции с длинными числами, естественно, выполняются поэлементно. Покажем реализацию самого простого метода — сложения с присваиванием (листинг 11.19).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Листинг 11.19. Метод сложения с присваиванием
LongLong& LongLong::operator+=(const LongLong &r)
{ typedef vector<char>::size_type sizeT;
  sizeT size = (v.size()>r.v.size())?v.size():r.v.size();   // большая длина
  unsigned carry = 0, sumDigit;             // перенос и цифра суммы
  LongLong Summa;                           // результат-сумма
  for(sizeT i = 0; i < size; i++)
  { sumDigit = digit(i) + r.digit(i) + carry;
    carry = sumDigit/10;                    // вычисляем новый перенос
    Summa.v.push_back(sumDigit%10);         // добавляем цифру в сумму
  }
  if (carry) Summa.v.push_back(carry);      // добавляем последний перенос
  v = Summa.v;
  return *this;
}
Нам потребовалась вспомогательная функция digit(), которая выдает очередную цифру длинного целого. Функция очень проста и ее реализацию можно прописать непосредственно в приватной части класса:
C++
1
2
char digit(unsigned i) const
{ if(i<v.size()) return v[i]; else return 0; }
Ну, и наконец, реализация функции вывода тоже тривиальна:
C++
1
2
3
4
5
ostream& operator<<(ostream &os, const LongLong &r)
{ for(int i = 0; i < r.v.size(); i++)
  os << int(r.v[r.v.size()-i-1]);       // вывод в обратном порядке
  return os;
}
Единственный нюанс — это вывод цифр числа (элементов вектора) в обратном порядке, поскольку число в векторе «лежит» от младшей цифры к старшей, а читаем мы числа от старшей цифры к младшей.
Реализацию остальных методов оставляем читателю. Используйте для реализации дружественных функций уже реализованные операции с присваиванием, например
C++
1
2
LongLong operator+(const LongLong &l, const LongLong &r)
{ LongLong tmp = l; tmp+=r; return tmp; }
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru