Найти - Пользователи
Полная версия: Сложение двух чисел
Начало » Python для новичков » Сложение двух чисел
1
GoshkaLP
Добрый день!
Задача такова: даны два неотрицательных целых числа и в каждом может быть до 1000 знаков.
Попробовал сгенерировать два рандомных числа по 1001 знаку каждый и сложить их встроенным сложением, вроде все работает.
Нужно ли в такой задаче писать алгоритм сложения длинных чисел (знаю, что на C++ точно пришлось бы писать такое) или достаточно воспользоваться обычным сложением Python?
py.user.next
Во втором питоне было ещё деление на целые числа и длинные целые числа (был тип 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 ~]$

Видишь, функцию набросал - и дальше можешь делать дело. А если функцию не можешь написать, потому что в тот раз давным давно в питоне уже было всё готовое и ты поленился писать функцию (включать мозги, тратить время), то при первой же проблеме в реальной программе ты просто не сможешь поправить баг и программа станет непригодной для новых условий. Будешь пользователям своим писать, которые тебе вопросы про ошибки с длинными числами присылают, мол “извините, для длинных чисел эта программа не работает, и я не планирую её для длинных чисел дорабатывать”, а сам просто знать не будешь, как её доработать, потому что на этапе обучения проскочил эту тему. Естественно, переписать на питон какую-нибудь громадную программу за пять минут не получится.
GoshkaLP
Спасибо, так как задачка была контестная, решил сделать ее на C++ с написанием своей длинки
py.user.next
GoshkaLP
так как задачка была контестная, решил сделать ее на C++
Можешь и на питоне её сделать, не используя свойство целых чисел питона. На питоне лучше учиться программированию, алгоритмическому разделу программирования, так как питон не забирает время на синтаксис. А чтобы C++ изучать, нужно прочитать основную книжку Страуструпа. Главное, нужно понимать, что изучение C++ приведёт тебя только к хорошему знанию синтаксиса C++ и знанию особенностей поведения его конструктивных элементов. При этом даже примитивную программу ты на нём не напишешь, потому что проектирование программы, разработка её алгоритмов - это совсем другая область программирования. Язык программирования - это набор кистей и красок, а программа - это написанная картина. Поэтому изучение кистей и красок приведёт тебя только к знанию кистей и красок. А как нарисовать простую кошку хотя бы карандашом одним? Для этого нужно учиться рисовать, изучать теорию изобразительного искусства, в ней весь секрет.
GoshkaLP
Я в тех вузе учусь и основы проги на Python, C++, а так же алгосы уже были в моем курсе. А выбрал язык C++ для этой задачи, потому что он все-таки побыстрее работает и поменьше памяти жрет. Проверил эту задачку как на Python, так и на C++ на тестах контеста и результаты работы на двух этих языках отличаются кардинально
Создал тему в разделе новичков, потому что не был до конца уверен, что обычное сложение из Python прокатило бы в той задаче, сама задача по себе пугала своим подвохом, ведь не во всех языках из коробки можно арифметические действия юзать со столь огромными чиселками
GoshkaLP
Еще раз спасибо за такой подробный ответ! Не часто встретишь людей на форумах, готовых потратить кучу времени на объяснение казалось бы такого простого материала
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB