Мой ответ меняется с тем же кодом
Я полный начинающий 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, установленным на моем компьютере. Кто-нибудь знает, что происходит?
Ответы
Ответ 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)