|
Модераторы: Daevaorn |
|
cppGhost |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
Уважаемые тру программисты. Я написал класс для сложения больших чисел. Но вот смотрю на код и понимаю, что написано коряво. Смысл функции вроде бы прост. Идем справа налево и складываем числа, запоминая остаток. Глядя на код opensource проектов и прочее, мне кажется, что моё творение явно можно написать лучше. Тут и много строк, и как-то нелаконично, и куча переменных, несколько if. Помогите мне стать лучше, пожалуйста.
Это сообщение отредактировал(а) cppGhost - 21.7.2016, 18:33 |
|||
|
||||
baldman88 |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 3 Всего: 7 |
Самое очевидное -- зачем на каждой итерации создавать новые переменные для num1 и num2? Создайте их вместе с overhead. С value аналогично.
Пы.Сы.: я не тру, если что Это сообщение отредактировал(а) baldman88 - 21.7.2016, 21:10 |
|||
|
||||
borisbn |
|
||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Их всё равно нужно обнулять на каждой итерации, а создание переменной на стеке вообще ничего не стоит. По вопросу - как по мне, так вполне себе нормальный и, самое главное, - понятный код. ИМХО не стОит усложнять.... Работает (да ещё и понятно написано) - не трогай. (С) кто-то там а вместо этого можно просто написать
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Можно написать короче, но отнюдь не понятнее Возникает вопрос - а оно надо?
Добавлено @ 11:48 PS. Еще можно вычисления num1 и num2 подставить непосредственно в место использования (стр 11), но это уже совсем монстр будет Это сообщение отредактировал(а) xvr - 22.7.2016, 11:49 |
|||
|
||||
cppGhost |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
Всем большое спасибо. Вообще это вечный для меня вопрос. Мне тоже кажется, что код более менее понятен (ну если комментами еще разбавить чуток, то вообще всё разжевано будет). И в нём должен разобраться вообще любой. Но, глядя на реализаии других подобных вещей, мне код кажется ущербным, ну и я туда же)) Например, это из библиотеки InfInt
всё как-то инкапсулировано, смысл спрятан. я вообще не понимаю, что тут происходит и как можно складывать числа слева направо (ну если только порядок не поменян специально). но, сравнивая моего монстра с этим, я бы, наверное, сам отдал предпочтение этому человеку, нежели себе)) Это сообщение отредактировал(а) cppGhost - 22.7.2016, 12:06 |
|||
|
||||
borisbn |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Посмотрел на реализацию "этого человека" и понял, что у Вас не учитывается знак.. Т.е. Ваш код должен работать только с положительными числами ?
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Remiznik |
|
|||
Опытный Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: нет Всего: 1 |
По поводу первого варианта кода.
Обязательно ли m_values.rend() и rhs.m_values.rend() вызывать на каждой итерации цикла ? может можно сохранить в переменных перед началом цикла ? |
|||
|
||||
volatile |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Этот код, практически бесполезен. Во первых из-за жуткого оверхеда. На 1 десятичный разряд используется как минимум 12 байт (инт + 2 указателя в листе) в 64-разрядных ОС еще больше...
Кроме того он не поддерживает отрицательные числа (об этом уже писали), а следовательно и вычитание будет нереализуемо. Имхо надо писать в шестнадцатиричном виде, верней в нативном формате int, и использовать вектор И это тот случай, когда на асме код получится проще, (в виду доступности флага переполнения) Из того что можно сократить, первое что бросиось в глаза:
Это сообщение отредактировал(а) volatile - 22.7.2016, 19:36 |
|||
|
||||
volatile |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
cppGhost |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
Спасибо. Про отрицательные числа - это у меня просто задача в моей вакуумной голове, поэтому просто не думал об этом.
Про лишние строки, спасибо, действительно лишнее. А про реализацию с шестнадцатеричными числами, тут я не понял(( |
|||
|
||||
volatile |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Я имел в виду двоичный формат (тот формат в котором работает процессор). это значительно повысит эффективность и упростит реализацию других арифметических функций (пожалуй кроме вывода в десятичном виде). Впрочем для новичка это будет пожалуй сложновато, и в учебных целях можно оставить и десятичный. но хотябы тогда уж использовать vector<unsigned char>, а не list<int> |
|||
|
||||
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |