Целью кода было создание разностороннего треугольника (с номером 1) с самой острой точкой, направленной вниз. Программа работает, пока вы не введете более 17 входных данных, после чего программа перестанет использовать только 1 с

Я посмотрел в программу математически и не вижу ошибки

n=int(input()) 
X=0
for j in range(0,n):
   X = (X*10)+1
print(X)
for i in range(1,n):
    X = (X-1)/10
    print(int(X))

Вы можете помочь найти почему?

-1
Ben Hanley 17 Авг 2019 в 18:24

2 ответа

Лучший ответ

У меня нет точного ответа, но это связано с точностью поплавка. Когда вы делаете X = (X-1)/10, вы выполняете деление с плавающей запятой, которое при больших числах приводит к проблемам с точностью: смотрите https://docs.python.org/3/tutorial/floatingpoint.html для получения дополнительной информации.

Вы можете обойти это в вашем случае с помощью целочисленного деления. Если вы замените X = (X-1)/10 на X = (X-1)//10, вы должны получить желаемое поведение.

1
Ravenlocke 17 Авг 2019 в 15:46

Python преобразует большие числа в числа с плавающей запятой для деления, что приводит к небольшим ошибкам при преобразовании двоичных чисел в десятичные с большими числами. Я обнаружил, что если вы измените назначение во втором цикле на

    X = ((X-1)//10)

Чтобы сделать усеченное деление, вы получите ожидаемый результат.

Было бы намного проще просто использовать строку из 1 и преобразовать в int позже.

n=int(input()) 
for i in range(n, 0, -1):
    print(i * '1')

# if needed
result = int(n * '1')

Выход (с вводом 20)

11111111111111111111
1111111111111111111
111111111111111111
11111111111111111
1111111111111111
111111111111111
11111111111111
1111111111111
111111111111
11111111111
1111111111
111111111
11111111
1111111
111111
11111
1111
111
11
1
0
Deepstop 17 Авг 2019 в 15:46