Форум сайта python.su
Добрый день!
Задача такова: даны два неотрицательных целых числа и в каждом может быть до 1000 знаков.
Попробовал сгенерировать два рандомных числа по 1001 знаку каждый и сложить их встроенным сложением, вроде все работает.
Нужно ли в такой задаче писать алгоритм сложения длинных чисел (знаю, что на C++ точно пришлось бы писать такое) или достаточно воспользоваться обычным сложением Python?
Офлайн
Во втором питоне было ещё деление на целые числа и длинные целые числа (был тип long)
Во втором питоне
>>> int <type 'int'> >>> long <type 'long'> >>> >>> 1L 1L >>>
>>> 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Нужно. Это полезно, так как не во всех языках есть длинные числа, как в питоне. Ты учишься программированию, используя питон для обучения, но это не значит, что полученные при этом обучении навыки программирования ты будешь потом применять, разрабатывая на том же языке, на котором учился программировать. Это сплошь и рядом происходит.
Нужно ли в такой задаче писать алгоритм сложения длинных чисел
[guest@localhost ~]$ echo "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" | awk '{ print $1 + $2 }'
3333333333333332738786672957290036516299633913475458249124829501869439173452657107303061593549438976
[guest@localhost ~]$
[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)
Офлайн
Спасибо, так как задачка была контестная, решил сделать ее на C++ с написанием своей длинки
Офлайн
GoshkaLPМожешь и на питоне её сделать, не используя свойство целых чисел питона. На питоне лучше учиться программированию, алгоритмическому разделу программирования, так как питон не забирает время на синтаксис. А чтобы C++ изучать, нужно прочитать основную книжку Страуструпа. Главное, нужно понимать, что изучение C++ приведёт тебя только к хорошему знанию синтаксиса C++ и знанию особенностей поведения его конструктивных элементов. При этом даже примитивную программу ты на нём не напишешь, потому что проектирование программы, разработка её алгоритмов - это совсем другая область программирования. Язык программирования - это набор кистей и красок, а программа - это написанная картина. Поэтому изучение кистей и красок приведёт тебя только к знанию кистей и красок. А как нарисовать простую кошку хотя бы карандашом одним? Для этого нужно учиться рисовать, изучать теорию изобразительного искусства, в ней весь секрет.
так как задачка была контестная, решил сделать ее на C++
Отредактировано py.user.next (Май 27, 2020 00:43:27)
Офлайн
Я в тех вузе учусь и основы проги на Python, C++, а так же алгосы уже были в моем курсе. А выбрал язык C++ для этой задачи, потому что он все-таки побыстрее работает и поменьше памяти жрет. Проверил эту задачку как на Python, так и на C++ на тестах контеста и результаты работы на двух этих языках отличаются кардинально
Создал тему в разделе новичков, потому что не был до конца уверен, что обычное сложение из Python прокатило бы в той задаче, сама задача по себе пугала своим подвохом, ведь не во всех языках из коробки можно арифметические действия юзать со столь огромными чиселками
Офлайн
Еще раз спасибо за такой подробный ответ! Не часто встретишь людей на форумах, готовых потратить кучу времени на объяснение казалось бы такого простого материала
Офлайн