Положить целые числа в табличной форме без пробелов в Python - PullRequest
0 голосов
/ 04 июня 2018

Извините, что я спрашиваю это здесь, потому что это кажется действительно элементарным и, скорее всего, спрашивалось раньше.Тем не менее, я искал и пытался часами, и я не мог найти ничего, что помогло бы мне.Я хочу написать программу, которая запрашивает верхнюю границу и возвращает таблицу с парами чисел (m, n), так что сумма делителей n (исключая n) равна m, и наоборот.

Теперь я написал следующее

bound = int(input('upper bound = '))
l = len(str(bound))
for x in range(1,l):
    print(' ', end='')
print('m', end='  ')
for y in range(1,l):
    print(' ', end='')
print('n', end='')
for i in range(1,bound):
    for j in range (1, bound):
        if j == i:
            break
        som_i = 0
        som_j = 0
        for k in range(1,i):
            if i % k == 0:
                som_i += k
        for l in range(1,j):
            if j % l == 0:
                som_j += l
        if som_i == j and som_j == i:
            print('{:{prec}d}'.format(j, prec = l).rstrip(''), end="")
            print('{:{prec}d}'.format(i, prec = l+2).lstrip(''), end="")

Проблема в том, что я хочу, чтобы пара отображалась в табличной форме из стороны в сторону и с правильным отступом, в зависимости от длины числа,Что бы я ни пытался (я уже прочитал очень много шагов с подобными вопросами), Python продолжает добавлять пробелы.

Может кто-нибудь помочь мне в этом?Я действительно новичок в Python, и я не могу понять это сам.Если уместно, я использую версию 3.6.

РЕДАКТИРОВАТЬ:

Например, когда я запускаю программу, я получаю:

upper bound = 300
  m    n        
220
284

, а я хочу получить

upper bound = 300
  m    n        
220  284

И аналогично для больших входов.

EDIT2 Мой вопрос не является дубликатом, поскольку я уже пытался добавить

end=""

, который не работал.

1 Ответ

0 голосов
/ 04 июня 2018

Первая проблема заключается в том, что вы не используете end='' после печати значения j, но вы, очевидно, уже знаете об этом.Вы также используете его после печати заголовка n, который вам не нужен.

Ваша отредактированная версия исправляет пропущенный end='' после печати j, но затемдобавляет один после i print, что, опять же, вам не нужно.

Я не уверен, что вы понимаете, что означает end='', поэтому вы просто вводите его в свой код случайным образом.Это не даст вам очень далеко.Вы можете прочитать документы для print, но краткая версия такова: используйте end='', когда вы печатаете что-то, что не должно быть концом строки, например mзаголовок и значение j, но не используйте , когда вы печатаете что-то, что равно как конец строки, как этот заголовок n и *Значение 1025 *.


Вторая проблема в том, что l слишком велико.После for l in range(1,j): это будет то же значение, что и j, что означает, что оно будет 219, так что вы собираетесь напечатать, что 220 заполнено до 219 символов, а 284 заполнено до221 персонажа.Таким образом, если ваш терминал не содержит более 446 символов, он будет прокручиваться по нескольким строкам и будет выглядеть как беспорядок.Я думаю, что вы можете здесь использовать 3 и 5.

Или, может быть, у вас есть какая-то другая переменная, которая должна быть 3, и вы хотите использовать (давайте назовем эту переменную x) x и x+2 вместо l и l+2.Но я не вижу никаких очевидных кандидатов в вашем коде.

Итак:

# ... unchanged lines
print('n') # no end='' here
# ... more unchanged lines
        # using 3 and 5 instead of l and l+2, and adding end=''
        print(('{:{prec}d}'.format(j, prec = 3)).rstrip(''), end='')
        print(('{:{prec}d}'.format(i, prec = 5)).lstrip(''))

А теперь вывод:

upper bound = 300
  m    n
220  284
...