Подтвердить что ты не робот

Мой ответ меняется с тем же кодом

Я полный начинающий python, и я пытаюсь решить эту проблему:

Число называется треугольным, если оно является суммой первых n положительных целые числа для некоторого n Например, 10 является треугольным, потому что 10 = 1 + 2 + 3 + 4 и 21 треугольно, потому что 21 = 1 + 2 + 3 + 4 + 5 + 6. Напишите программу Python чтобы найти наименьшее шестизначное треугольное число. Введите его как свой ответьте ниже.

Я написал эту программу:

n = 0
trinum = 0
while len(str(trinum)) < 6:
    trinum = n*(n+1)/2
    n += 1
print(trinum)

И он работает только в python, который я установил на моем компьютере, если я говорю while len(str(trinum)) < 8:, но он должен быть while len(str(trinum)) < 6:. Поэтому я пошел в http://www.skulpt.org/ и запустил там свой код, и он дал мне правильный ответ с while len(str(trinum)) < 6:, как он предполагал. Но это не работает с 6 с python, установленным на моем компьютере. Кто-нибудь знает, что происходит?

4b9b3361

Ответ 1

Короткий ответ

В Python 3 деление всегда является делением с плавающей запятой. Итак, на первом проходе вы получите что-то вроде str(trinum) == '0.5'. Это не то, что вы хотите.

Вы ищете целочисленное деление. Оператор для этого //.

Длинный ответ

Оператор разделения изменился в Python 2.x на 3.x. Раньше тип результата зависел от аргументов. Итак, 1/2 выполняет целочисленное деление, но 1./2 выполняет деление с плавающей запятой.

Чтобы очистить это, был введен новый оператор: //. Этот оператор всегда будет делать целочисленное деление.

Итак, в Python 3.x это выражение (4 * 5)/2 равно 10.0. Обратите внимание, что это число меньше 100, но в нем есть 4 символа.

Если вместо этого мы сделали (4*5)//2, мы получим целое число 10 назад. Это позволит вашему состоянию оставаться верным.

Ответ 2

В Python 2 оператор / выполняет по возможности целое деление: "x, деленное на y, является остатком b", отбрасывая "b" (используйте оператор % для поиска "b" ). В Python 3 оператор / всегда выполняет float-деление: "x, деленное на y, равно a.fgh". Получите целочисленное деление в Python 3 с помощью оператора //.

Ответ 3

У вас здесь две проблемы, которые в совокупности дают вам неправильный ответ.

Первая проблема заключается в том, что вы используете /, что означает целочисленное деление в Python 2 (и язык почти Python, который реализует Skulpt), но разделение float на Python 3. Итак, когда вы запускаете его на своем локальная машина с Python 3, вы получите цифры с плавающей запятой.

Вторая проблема заключается в том, что вы не проверяете "менее 6 цифр", на которые вы проверяете "до 6 символов". Для целых положительных чисел это одно и то же, но для float, скажем, 1035.5 - всего 4 цифры, но это 6 символов. Итак, вы выходите рано.

Если вы решите любую проблему, она будет работать, по крайней мере, большую часть времени. Но вы действительно должны решить оба.

Итак:

n = 0
trinum = 0
while trinum < 10**6: # note comparing numbers, not string length
    trinum = n*(n+1)//2 # note // instead of /
    n += 1
print(trinum)

Первая проблема исправлена ​​с помощью //, которая всегда означает целочисленное деление вместо /, что означает разные вещи в разных версиях Python.

Вторая проблема фиксируется путем сравнения числа как числа с 10**6 (то есть от 10 до 6-й степени, что означает 1 с 6 нулями или 1000000) вместо сравнения его длины как строки с 6.

Ответ 4

Взяв ответ Малика Брахими:

from itertools import *
print(next(dropwhile(lambda n: n <= 99999, accumulate(count(1))))
  • count(1) - это все числа от 1 до бесконечности.
  • accumulate(count(1)) - это все текущие итоги этих чисел.
  • dropwhile(…) пропускает начальные итоговые итоги до тех пор, пока мы не достигнем 100000, а затем все остальные.
  • next(…) является следующим после тех, которые мы пропустили.

Конечно, вы можете утверждать, что 1-футовый, который берет 4 строки для описания новичку, не так хорош, как 4-лайнер, который не нуждается в каких-либо объяснениях.:)

(Кроме того, dropwhile является немного уродливым.Основным его использованием в Python. На языке, таком как Haskell, где вы можете написать этот предикат с секционированием оператора вместо лямбда, например (<= 99999), это другой рассказ.)

Ответ 5

Метод разделения в Py2.x и 3.x различен - поэтому, вероятно, у вас возникли проблемы. Просто еще одно предложение - которое не касается разделов и длин - настолько менее багги в целом. Плюс добавление - в любом месте.

trinum = 0
idx =0

while trinum < 99999: #largest 5 digit number
    idx += 1
    trinum += idx

print trinum

Ответ 6

import itertools # to get the count function
n, c = 0, itertools.count(1) # start at zero 

while n <= 99999:
    n = n + next(c)