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

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

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

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

21.07.2016, 18:32. Просмотров 210. Ответов 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++
C++ Класс больших чисел. Деление по Кнуту.
Класс для выполнения операций сложения, вычитания и умножения комплексных чисел C++
C++ Рекурсия: Написать функцию умножения двух чисел, используя только операцию сложения
C++ : Написать функцию умножения двух чисел, используя только операцию сложения
C++ Оцените класс больших чисел класс big_int
Написать функцию умножения двух чисел, используя только операцию сложения C++
Реализовать класс больших чисел с функциями сложения, вычитания, записи и вывода C++
C++ Перегруженные функции для сложения вещественных чисел; для сложения комплексных чисел
C++ Написать класс для сложения массива
Написать функцию для сложения двух чисел C++
Написать класс для сложения матриц C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pav1uxa
1753 / 1593 / 610
Регистрация: 23.01.2014
Сообщений: 5,742
Завершенные тесты: 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
621 / 467 / 126
Регистрация: 08.09.2013
Сообщений: 1,217
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     Написать элегантнее класс для сложения больших чисел
Ответ Создать тему
Опции темы

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