如何以表格格式打印素数

2024-04-19 08:11:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是以表格格式打印素数,而不是每行打印一个值。到目前为止,我所有的尝试都以行或打印错误的表格告终

start = int(input("Start number: "))
end = int(input("End number: "))

if start < 0 or end < 0:
    print("Start and End must be positive.")
    start = int(input("Start number: "))
    end = int(input("End number: "))
if end < start:
    print("End must be greater than Start number: ")
    start = int(input("Start number: "))
    end = int(input("End number: "))

prime = True
for num in range(start,end+1):
    if num > 1:
        for i in range(2,num):
            if num % i == 0:
                break
        else:
            num = print(num)

我这里的那个只能逐行打印

#start number: 1
#end number: 100
 # 2  3  5  7 11 13 17 19 23 29 
 #31 37 41 43 47 53 59 61 67 71 
 #73 79 83 89 97 

Tags: innumberforinputifbestartnum
2条回答

您可以使用^{}并使用generator实现一个可重用解决方案:

from math import floor

def tabular(records, line_width=42, sep_space=3):
    
    width = len(str(max(records))) + sep_space
    columns = floor(line_width/width)
    
    for i in range(0, len(records), columns):

        row_records = records[i:i+columns]
        row_format = ("{:>" + str(width) + "}") * len(row_records)

        yield row_format.format(*row_records)
# test data / prime numbers
numbers = [
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 
    41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
    89, 97
]

for row in tabular(numbers):
    print(row)

#    2    3    5    7   11   13   17   19
#   23   29   31   37   41   43   47   53
#   59   61   67   71   73   79   83   89
#   97

其他一些数字的示例:

for row in tabular(list(range(0, 1600, 50)), 79, 2):
    print(row)

#     0    50   100   150   200   250   300   350   400   450   500   550   600
#   650   700   750   800   850   900   950  1000  1050  1100  1150  1200  1250
#  1300  1350  1400  1450  1500  1550

使用str.format但不使用生成器的示例:

# test data / prime numbers
numbers = [
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 
    41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
    89, 97
]

width = len(str(max(numbers))) + 3

for i in range(0, len(numbers), 10):

    row_records = numbers[i:i+10]
    row_format = ("{:>" + width + "}") * len(row_records)
    print(row_format.format(*row_records))

#    2    3    5    7   11   13   17   19   23   29
#   31   37   41   43   47   53   59   61   67   71
#   73   79   83   89   97

这可以通过str.rjust或它的朋友来完成

>>> "2".rjust(3)
'  2'
>>> 

首先,我们收集要打印的数字,计算其中最大的字符需要多少个字符,再加上一个字符,结果就是我们将用于rjust的数字

>>> nums=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>> j = len(str(max(nums))) + 1
>>> 

现在我们选择每行要打印的数量

>>> linesize = 10
>>> 

最后,我们使用print只包含关键字的参数end来控制何时在同一行中打印,以及enumerate来控制我们已经打印了多少行

>>> for i,p in enumerate(nums,1):
        print( str(p).rjust(j), end="" )
        if i%linesize==0:
            print() #to go to the next line

        
  2  3  5  7 11 13 17 19 23 29
 31 37 41 43 47 53 59 61 67 71
 73 79 83 89 97
>>> 

相关问题 更多 >