如何编写一个程序来寻找最大的4位素数,其数字之和也是素数?

2024-09-29 00:18:17 发布

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

正确的输出为:9967

说明: 素数是任何只能被1和它本身整除的数。例如2、3、5、7、11、13、17、19、23、29、31,。。。。。。。。 数字总和指该数字中所有数字的总和。例如,数字为1234,则数字之和为1+2+3+4=10

def sumofprime(x):
    con1,con2=False,False 
    for num in range(x,1000,-1):
        for i in range(2, num):
            if (num % i) == 0:
                break
            else:
                print(num)
                con1=True
                break
    sum=0
    while(num>0):
        dig=num%10
        sum=sum+dig
        num=num//10
    print(sum)
    
    
    x=sum
    for i in range(2, x):
        if (x % i) == 0:
            print(x, "is not a prime number") 
            break
        else:
            print(x, "is a prime number")
            con2=True
        
        
    if con1==True and con2==True:
        print(num,sum)
        break
    else:
        sumofprime(x-1)
        


sumofprime(9999)

Tags: intrueforifrange数字elsenum
1条回答
网友
1楼 · 发布于 2024-09-29 00:18:17

不能在循环外使用break。您的代码看起来过于复杂和冗长。您应该使用“分而治之”策略来解决您的问题:

问题清单:

  1. n下生成素数
  2. 由此得到所有素数,它们的数字和也是素数
  3. 获取这些素数的最大值并打印它

生成所有需要的素数':

def primes(n):
    """Credit:   https://stackoverflow.com/a/3035188/7505395"""
    sieve = [True] * n
    for i in range(3, int(n ** 0.5) + 1, 2):      
        if sieve[i]:          
            sieve[i * i :: 2 * i] = [False] * ((n - i * i - 1) // (2 * i) + 1)
    return {2} | {i for i in range(3, n, 2) if sieve[i]}

提取素数数字和的素数:

def sumofprime(x): # python 3.8+, less complicated variant for up to 3.7 further down
  ps = primes(x)
  return ((p,su) for p in sorted(ps) if ((su := sum(map(int,str(p)))) != p and su in ps))

获取最大素数并打印:

all_primes_with_sums_below_10000 = list(sumofprime(10000))

answer = "Prime {} internal digit sum is {} and also prime."
print(answer.format(*max(all_primes_with_sums_below_10000)) )

输出:

Prime 9967 internal digit sum is 31 and also prime.

你可以翻译

def sumofprime(x):
  ps = primes(x)
  return ((p,su) for p in sorted(ps) if ((su := sum(map(int,str(p)))) != p and su in ps))

进入使用python 3.8之前版本的循环,如下所示:

def sumofprime(x): # python before 3.8
  # get all primes
  ps = primes(x)
  rv = []
  # lets use sorted for some orderly printing if you print them all
  for p in sorted(ps):
     # get the inner sum
     su = sum(map(int,str(p)))
     # 2=2 and 5=5 etc are boring, also only interested in sums that are primes
     if su != p and su in ps:
         rv.append( (p,su) ) 
  return rv

相关问题 更多 >