Уведомления

Группа в Telegram: @pythonsu

#1 Май 26, 2020 00:16:00

GoshkaLP
Зарегистрирован: 2016-09-29
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложение двух чисел

Добрый день!
Задача такова: даны два неотрицательных целых числа и в каждом может быть до 1000 знаков.
Попробовал сгенерировать два рандомных числа по 1001 знаку каждый и сложить их встроенным сложением, вроде все работает.
Нужно ли в такой задаче писать алгоритм сложения длинных чисел (знаю, что на C++ точно пришлось бы писать такое) или достаточно воспользоваться обычным сложением Python?

Офлайн

#2 Май 26, 2020 05:57:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9843
Репутация: +  853  -
Профиль   Отправить e-mail  

Сложение двух чисел

Во втором питоне было ещё деление на целые числа и длинные целые числа (был тип long)
Во втором питоне

  
>>> int
<type 'int'>
>>> long
<type 'long'>
>>>
>>> 1L
1L
>>>

В третьем питоне оставили только long и удалили разделение.
В третьем питоне
  
>>> int
<class 'int'>
>>> long
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'long' is not defined
>>>
>>> 1L
  File "<stdin>", line 1
    1L
     ^
SyntaxError: invalid syntax
>>>

GoshkaLP
Нужно ли в такой задаче писать алгоритм сложения длинных чисел
Нужно. Это полезно, так как не во всех языках есть длинные числа, как в питоне. Ты учишься программированию, используя питон для обучения, но это не значит, что полученные при этом обучении навыки программирования ты будешь потом применять, разрабатывая на том же языке, на котором учился программировать. Это сплошь и рядом происходит.

Вот пример в awk
[guest@localhost ~]$ echo "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" | awk '{ print $1 + $2 }'
3333333333333332738786672957290036516299633913475458249124829501869439173452657107303061593549438976
[guest@localhost ~]$
Как следует из примера, awk не может сложить стозначное число из единиц со стозначным числом из двоек (должно получиться стозначное число из троек). Но если у нас программа уже на awk написана и туда надо добавить сложение таких чисел, потому что они вдруг начали приходить в программу? Можно написать функцию в awk, которая сделает сложение в длинных числах.

Пример с усечённой функцией
(функция работает только для небольшого числа входных чисел)
[guest@localhost ~]$ echo "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" | awk '
>
> { print f($1, $2) }
>
> function f(a, b, arr1, arr2, out) {
> for (i = 1; i <= length(a); i++) {
> arr1[i] = substr(a, i, 1)
> }
> for (i = 1; i <= length(b); i++) {
> arr2[i] = substr(b, i, 1)
> }
> for (i = 1; i <= length(a); i++) {
> out = out arr1[i] + arr2[i]
> }
> return out
> }
>
> '
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
[guest@localhost ~]$
[guest@localhost ~]$ echo "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" | awk '

> { print $1, "+", $2, "=", f($1, $2) }
>
> function f(a, b, arr1, arr2, out) {
> for (i = 1; i <= length(a); i++) {
> arr1[i] = substr(a, i, 1)
> }
> for (i = 1; i <= length(b); i++) {
> arr2[i] = substr(b, i, 1)
> }
> for (i = 1; i <= length(a); i++) {
> out = out arr1[i] + arr2[i]
> }
> return out
> }
>
> '
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 + 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 = 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
[guest@localhost ~]$

Видишь, функцию набросал - и дальше можешь делать дело. А если функцию не можешь написать, потому что в тот раз давным давно в питоне уже было всё готовое и ты поленился писать функцию (включать мозги, тратить время), то при первой же проблеме в реальной программе ты просто не сможешь поправить баг и программа станет непригодной для новых условий. Будешь пользователям своим писать, которые тебе вопросы про ошибки с длинными числами присылают, мол “извините, для длинных чисел эта программа не работает, и я не планирую её для длинных чисел дорабатывать”, а сам просто знать не будешь, как её доработать, потому что на этапе обучения проскочил эту тему. Естественно, переписать на питон какую-нибудь громадную программу за пять минут не получится.



Отредактировано py.user.next (Май 26, 2020 06:05:24)

Офлайн

#3 Май 26, 2020 22:08:57

GoshkaLP
Зарегистрирован: 2016-09-29
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложение двух чисел

Спасибо, так как задачка была контестная, решил сделать ее на C++ с написанием своей длинки

Офлайн

#4 Май 27, 2020 00:42:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9843
Репутация: +  853  -
Профиль   Отправить e-mail  

Сложение двух чисел

GoshkaLP
так как задачка была контестная, решил сделать ее на C++
Можешь и на питоне её сделать, не используя свойство целых чисел питона. На питоне лучше учиться программированию, алгоритмическому разделу программирования, так как питон не забирает время на синтаксис. А чтобы C++ изучать, нужно прочитать основную книжку Страуструпа. Главное, нужно понимать, что изучение C++ приведёт тебя только к хорошему знанию синтаксиса C++ и знанию особенностей поведения его конструктивных элементов. При этом даже примитивную программу ты на нём не напишешь, потому что проектирование программы, разработка её алгоритмов - это совсем другая область программирования. Язык программирования - это набор кистей и красок, а программа - это написанная картина. Поэтому изучение кистей и красок приведёт тебя только к знанию кистей и красок. А как нарисовать простую кошку хотя бы карандашом одним? Для этого нужно учиться рисовать, изучать теорию изобразительного искусства, в ней весь секрет.



Отредактировано py.user.next (Май 27, 2020 00:43:27)

Офлайн

#5 Май 27, 2020 00:52:16

GoshkaLP
Зарегистрирован: 2016-09-29
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложение двух чисел

Я в тех вузе учусь и основы проги на Python, C++, а так же алгосы уже были в моем курсе. А выбрал язык C++ для этой задачи, потому что он все-таки побыстрее работает и поменьше памяти жрет. Проверил эту задачку как на Python, так и на C++ на тестах контеста и результаты работы на двух этих языках отличаются кардинально
Создал тему в разделе новичков, потому что не был до конца уверен, что обычное сложение из Python прокатило бы в той задаче, сама задача по себе пугала своим подвохом, ведь не во всех языках из коробки можно арифметические действия юзать со столь огромными чиселками

Офлайн

#6 Май 27, 2020 00:58:43

GoshkaLP
Зарегистрирован: 2016-09-29
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Сложение двух чисел

Еще раз спасибо за такой подробный ответ! Не часто встретишь людей на форумах, готовых потратить кучу времени на объяснение казалось бы такого простого материала

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version