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

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

Войти
Регистрация
Восстановить пароль
 
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
#1

Написать элегантнее класс для сложения больших чисел - C++

21.07.2016, 18:32. Просмотров 238. Ответов 3
Метки нет (Все метки)

Уважаемые тру программисты. Я написал класс для сложения больших чисел. Но вот смотрю на код и понимаю, что написано коряво. Смысл функции вроде бы прост. Идем справа налево и складываем числа, запоминая остаток. Глядя на код opensource проектов и прочее, мне кажется, что моё творение явно можно написать лучше. Тут и много строк, и как-то нелаконично, и куча переменных, несколько if. Помогите мне стать лучше, пожалуйста.

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
CBigNumber Sum(CBigNumber &rhs)
    {
        int overhead = 0;
        CBigNumber newNumber;
 
        list<int>::reverse_iterator it1 = m_values.rbegin();
        list<int>::reverse_iterator it2 = rhs.m_values.rbegin();
 
        while(it1 != m_values.rend() || it2 != rhs.m_values.rend())
        {
            int num1 = 0;
            if(it1 != m_values.rend())
                num1 = *it1++;          
 
            int num2 = 0;
            if(it2 != rhs.m_values.rend())
                num2 = *it2++;
 
            int value = num1 + num2 + overhead;
            if(value >= 10)
            {
                overhead = value / 10;
                value = value % 10;             
            }   
            else
            {
                overhead = 0;
            }
 
            newNumber.m_values.push_front(value);           
        }
 
        if(overhead)
            newNumber.m_values.push_front(overhead);
 
        return newNumber;
    };
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2016, 18:32     Написать элегантнее класс для сложения больших чисел
Посмотрите здесь:

Реализовать класс больших чисел с функциями сложения, вычитания, записи и вывода - C++
Надо реализовать класс, что будет содержать массив с 40 элементов. Предусмотреть функции сложения/вычитания, записи/вывода. Я уже на...

Написать класс для сложения матриц - C++
Надо написать класс который будет складывать матрицы. Не могу грамотно закончить программу. Не знаю как передать результат в главную...

Написать класс для сложения массива - C++
Написать класс для сложения массива массив сатический, задан в main.

Перегруженные функции для сложения вещественных чисел; для сложения комплексных чисел - C++
Написать перегруженные функции и основную программу, которая их вызывает. для сложения вещественных чисел; для сложения комплексных чисел...

Написать функцию для сложения двух чисел - C++
... без использования &quot;+&quot; и других арифметических операций. P.S. Кто знает, пожалуйста, не пишите ответ сразу, пусть другие тоже...

Класс больших чисел. Деление по Кнуту. - C++
Кнут т2 стр. 300 алгоритм D. Кто реализовал для b=2^32 или 2^16 - поделитесь, плз, если не жалко ! (А то у меня много неясных моментов....

Написать класс чисел, для которых определено сложение и вычитание по модулю восьми - C++
Задачки легкие, но буду очень признателен, если кто-нибудь поможет.:help: 2) Написать класс чисел, для которых определено сложение и...

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

Написать функцию умножения двух чисел, используя только операцию сложения - C++
Используя рекурсивные функции, решить следующую задачу. Написать функцию умножения двух чисел, используя только операцию сложения

Рекурсия: Написать функцию умножения двух чисел, используя только операцию сложения - C++
Написать функцию умножения двух чисел, используя только операцию сложения. (помогите с решением)

Класс "Пара чисел" с перегруженными операциями сложения и умножения - C++
Брат, братан, братишка помоги у нас решили вести ООП на с++ а я в нем ту-ту полный, до этого все время на паскале балакали. Если можешь...

Задача для сложения чисел в строке. - C++
Привет всем, хочу у вас проконсультироваться, что у меня тут не правильно. Задача: Создать текстовый файл с произвольным числом...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pav1uxa
1787 / 1627 / 621
Регистрация: 23.01.2014
Сообщений: 5,884
Завершенные тесты: 1
21.07.2016, 22:18     Написать элегантнее класс для сложения больших чисел #2
Цитата Сообщение от xTr1m Посмотреть сообщение
Помогите мне стать лучше
А что представляет из себя m_values? Какой тип значений у списка? Эти значения представляют собой десятичные разряды числа?

Если бы список хранил тип uint8_t (1 байт данных) все операции (сложения, вычитания и т.д.) было бы реализовать на порядок проще.
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
22.07.2016, 11:54  [ТС]     Написать элегантнее класс для сложения больших чисел #3
Да, определение такое list<int> m_values. А как можно было бы легче. я что-то совсем не представляю
gng
632 / 478 / 130
Регистрация: 08.09.2013
Сообщений: 1,264
22.07.2016, 23:13     Написать элегантнее класс для сложения больших чисел #4
Цитата Сообщение от xTr1m Посмотреть сообщение
и куча переменных
Количество переменных можно уменьшить, например, за счет лаконичности и гибкости сишки, в отличие от тех же плюсов. [/сарказм]
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
#include <iostream>
#include <string>
 
std::string li_add (const std::string &v1, const std::string &v2)
{
  std::string v;
  int c = 0;
  for (const char *p1= v1.c_str(), *p2= v2.c_str(); *p1 || *p2 ; ) {
    c+= *p1 + *p2 -'0'-'0';
    v.push_back ( c % 10 + '0');
    c /= 10;
    if (*p1) ++p1; if (*p2) ++p2;
  }
  if (c) v.push_back (c + '0');
  return v;
}
 
int main (int ac, char *av[]) {
  std::string v1 = std::string (av[1]);
  std::string v2 = std::string (av[2]);
  std::string res = li_add (std::string(v1.rbegin(), v1.rend()), std::string(v2.rbegin(), v2.rend()));
  std::cout << std::string (res.rbegin(), res.rend()) << std::endl;
  return 0;
}
Добавлено через 7 часов 57 минут
PS. Исправление ошибки в строке 9
C++
1
c+= *p1 && *p2 ? *p1 + *p2 -'0'-'0': *p1 + *p2 - '0';
Yandex
Объявления
22.07.2016, 23:13     Написать элегантнее класс для сложения больших чисел
Ответ Создать тему
Опции темы

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