Помогите чайнику / программирование :: пидоры помогите (реактор помоги) :: помощь :: python :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)

программирование geek python помощь песочница пидоры помогите 

Помогите чайнику

Дана задача с такими условиями
Посчитать сумму чисел от 1 до N. Значение N по модулю не превышает 10^{9} .
Входные данные содержат одно целое число — N.
Нужно вывести целое число — сумму чисел от 1 до N.

Мой "код" на Python выглядит так:

N=int(input())
d=1
rez=((2+d*(N-1))*N)/2
print(int(rez))

Из 8 вариантов переменной N, c 5 получается правильный результат, а два выдают неправильный. В чём может быть проблема?

Подробнее
программирование,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,python,помощь,песочница,пидоры помогите,реактор помоги
Еще на тему
Развернуть
rez=((1+d*(N))*N)/2
результаты не изменились
попробуй тогда переменную не int взять, а float. Может сработать так как насколько я помню под переменную данного типа отдают больше памяти.
Хороший вариант, но опять ничего не поменялось
Там вот такая подсказка есть. если это что то даст
"Для представления целых чисел в языках программирования обычно используется несколько
целочисленных типов данных с разными допустимыми диапазонами значений."
N=float(input())
d=1.0
rez=((1.0+(N))*N)/2
print(float(rez))
Выдаёт все ошибки
нахера тут флоат? Здесь целочисленное же все.
Расширить диапазон значений, не змеевод, так что фиг его знает какие ещё типы поддерживает, ниже предложили так:
N=int64(input())
rez=((1+N)*N)/2
print(int64(rez))
В питоне автоматически применяется длинная арифметика для злоебучих целых чисел, превышающих стандартные размеры. Должно работать. Попробуй деление осуществлять с помощью "//" (целочисленное деление).
d конечно лишняя, но пусть будет
Согласен, она осталась после какой-то из бесчисленных попыток поправить результат
Так, блэт :) То ли я слишком пьян, то ли формула неверная. Вроде ж в условии сумма целых чисел от одного до N? То есть rez=N*(N+1)/2 Че ещё за d?
Это разность арифметической прогрессии
До N включительно? Если да, то rez=N*(N+1)/2. По твоей формуле - до N-1
Согласен, но даже так, те же два остаются неверными
Так, а какая версия интерпритатора? 2 или 3?
В задаче подразумевается появление заведомо неверных чисел? Например отрицательных?
Неизвестно. Я вообще без понятия что там, все что знаю я, всё в посте
Насколько я вижу, из описания, даже сделана пометка - по модулю. А значит отрицательные возможны. Сделай проверку виду:
if N >= 0:
rez = N*(N+1) / 2
else:
rez = -N*(N-1)/2 + 1
Теперь два правильно, а остальные нет)
Те самые два? Или другие?
Другие
Т.е. отрицательные N все же подаются, но их требуется брять по модулю? Хмм. А что за сайт то?
А ведь нигде не сказано про модуль. Единственное упоминание верхней границы значения переменной. То есть прогрессия может быть и от 1 до -1000000000
Да вот и я про тоже, но вот мы добавили проверку на сумму в отрицательную сторону и стали валиться первые 5. Какие там N - неизвестно, ориентируемся вслепую.
Может до N исключительно?
Единственное что могу сказать - вряд ли дело в типах. В python 3 для целых чисел есть 1 тип - int. Он может содержать в себе значения до 2^31 на x86 и до 2^63 на x64 версиях. В python 2 - да, есть отдельный тип - long, но в 3ке их слили с int. Так что типы не при чем,
Я не питонист, про типы хз. Просто тут прозвучала "подсказка", где почти явно говорили про расширенный int.

А может просто цикл запилить? Не так элегантно, но действенно.
в int() в python3 слили long, так что достаточно просто int()
Школьная олимпиада, ознакомительный тур https://olympic.nsu.ru/nsuts-new/new_report
Вот 2 варинат. Попробуй оба, скажи какие ошибки полезли.
# С учетом отрицательных N = int(inputO) rez = (N*(abs(N)+l) / 2) if N <= 0: rez = rez + 1 print(int(rez)) # N по модулю N = abs(int(input())) if N == 0: print(1) else: print(int(N*(N+l) / 2))
ниже уже постил.
Исключение у нас одно, так что городить огород нет смысла.
Хотя, у меня тоже тут тот еще велосипед
rez = ((N+l)*N/2) print(rez) elif N < 0: rez (((N-l)*N/2)*(-l)) print(rez)
В 6й строке нужно еще 1 отнять, если от N до 1 считать. Проверь при N=-10:
sum(range(N, 2))
Тогда так, получается.
("input \n$")) 1 N = int(i 2T if N > 0: rez = ((N+l)*N/2) 4 print(rez) 5 - elif N < 0: rez (((N-l)*N/2)*(-l)) print( (rez+1)) 8T else: 9 print("1")
Одно всё равно не правильно, но спасибо огромное
Ну и в input() надо все ж чо-т напейсать. А то некрасиво.
например: input("input \n$")
Если это на сайте проверяется, то там автотестинг: как раз таки не надо - тесты красоту не ценят. Однако я удивлен, что тут данные заносят в stdin, а не требуют скачать из файла.
С первым вариантом неправильным остаётся только второй
А со вторым неправильны 3, два начальных и один другой
Значит есть что то одно, что мы не учли в первом варианте.
У меня остается только одно предположение. int ограничен 2^63 в x64 версии (где то 1e+18), а пограничное значение N - 1e^10. При перемножении разряд может переполниться. Поэтому, давай добавим деление заранее, что бы избежать этого.
N = int(inputO) N2 = N / 2 rez = N2 * (abs(N)+l) if N <= 0: rez = rez + 1 print(int(rez))
Хм, всё равно тот же результат, последнее не правильно. Может проблема не в переполнение
Жаль. Тогда остается заменить
N2 = N / 2
На
N2 = N // 2
Если не поможет, тогда я уже точно ничего путного не придумаю.
N = 0 надо отдельно обрабатывать.
от 1 до 0 сумма будет равна 1.
А тут 0 будет. Если, конечно, я не путаю сейчас ничего
Верно. Поправил в вариантах, что выше
Покажи, при каких вариантах не срабатывает
В этом вся проблема. Эта задача с сайта, туда я загружаю код, а мне выдаётся результат. Соответственно варианты мне не известны.
ошибка скорее всего при отрицательных N
N целое, а не натуральное в условии
Когда я меняю отрицательные N на положительные, один из ответов становится неверным
double может хранить без потерь 16-значные целые числа, а результат перемножения 9*10^8 - 18-значный
Пожалуйста, можно подробнее, что изменить, что бы поправить?
может Decimal поможет https://docs.python.org/2/library/decimal.html
если N 0, то (N + 1) * N / 2
и числа бери либо double, либо int64_t
если N меньше или равно 0 - то (2 + module(N)) * (1 - module(N) / 2
если N больше 0 - то (N + 1) * N / 2
и как написали выше, double хранит только примерно 16 десятичных чисел, так что лучше бери int64_t - он как раз хранит больше 18 десятичных чисел
Я всё же чайник, можно объяснить пожалуйста, как это сделать?
я в python не шарю, так что только логику опишу
int64_t N = int64(input())
if (N больше 0)
then
rez = (int64_t(1) + N) * N / 2;
else
rez = (int64_t(2) + module(N)) * (int64_t(1) - module(N)) / 2;
endif
S = (a1+aN)*N/2

N=int(input())
rez = int((N+1)*N/2)
print(rez)
вот так, если учитывать отрицательные числа
rez = ((N+l)*N/2) print(rez) elif N < 0: rez (((N-l)*N/2)*(-l)) print(rez)
Ха, я у тебя в заблокированных! Иди на хуй, мразь)
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
ГЕНЕРАТОР СИНУСА с АПЧ ^-1 . И Д 250-400 КГц МИНУТЫ 15 КНОПКИ Т АММЕР А мощность 100% .т- 50% . выход СИГНАЛА ВКЛЮЧЕНИЕ ПИТАНИЯ ПИТАНИЕ ПРИБОРА НЕТ РЕЗОНАНСА№. reКУПОН НА 1 помощь