问题:编写程序,输出所有由1,2,3,4这四个数字组成的所有素数,并且在每个素数中每个数字只使用一次
以下是我编写的代码
digits = (1, 2, 3, 4)
for i in digits:
ii = i*1000
for j in digits:
if j == i:
continue
jj = j * 100
for k in digits:
if k == i or k == j:
continue
kk = k * 10
for m in digits:
if m != i and m != j and m != k:
p = ii + jj + kk + m
for n in range(1234, int(p**0.5)+1):
if p % n == 0:
break
else:
print(p)
但是运行结果确是输出了所有由这四个数字组成的四位数
1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321
我想问一下是哪里出错了,希望能得到各位的指点
把打印素数放到最后一个for循环结束后,然后把判断素数从2开始即可。
修改如下:
digits = (1, 2, 3, 4)
for i in digits:
ii = i*1000
for j in digits:
if j == i:
continue
jj = j * 100
for k in digits:
if k == i or k == j:
continue
kk = k * 10
for m in digits:
if m != i and m != j and m != k:
p = ii + jj + kk + m
prime=1 # 素数标志,默认当前的p为素数
# 判断素数 从2开始
for n in range(2, int(p**0.5)+1):
# 如果区间的任意一个数可以整除p,标志此数不是素数,并退出循环
if p % n == 0:
prime=0
break
if prime==1: # 判断完区间所有的数都不能整除p,则p为素数,打印它
print(p)
扩展了一下,如果有重复数字也可以用
digits = (1, 2, 3, 4, 1)
arr = sorted(digits,reverse=True)
mn = sum([arr[- n - 1] * 10 ** (len(arr) - n - 1) for n in range(len(arr))] )
mx = sum([arr[n] * 10 ** (len(arr) - n - 1) for n in range(len(arr))] )
for i in range(mn,mx + 1):
if sorted(str(i)) != sorted(str(mx)):
continue
for n in range(2,int(i ** .5) + 1):
if i % n == 0:
break
else:
print(i)