[金貨5]2023号:不思議な少数


🛠 質問する


https://www.acmicpc.net/problem/2023

👩🏻‍💻 解決策


まずはタイムアウトで合わないプール...
一番左側の数は(2,3,5,7)なので、各始点(?)makePrime関数が呼び出されました
次に、右側に表示できる数字(奇数)を貼り付け、その値が小数であればmakePrimeを再帰的に呼び出します.
nビットに到達すると出力(n=0)値
ソースコード
def isPrime(n):
  if n < 2: return False
  cnt = 0
  for i in range(2, n):
    if n % i == 0:
      cnt += 1
      break
  if cnt == 0:
    return True
  else:
    return False
  
n = int(input())

def makePrime(first, n):
  if n == 0:
    print(first)
  
  for i in [1, 3, 5, 7, 9]:
    tmp = first*10 + i
    if isPrime(tmp):
      makePrime(tmp, n-1)

for i in [2, 3, 5, 7]:
  makePrime(i, n-1)

💡 他人の解答

def find(num): 
  for i in range(2, int(int(num)**0.5)+1): 
    if int(num) % i == 0: 
      return 

    if len(num) == n: 
      print(num) 
      return 
      
    for p in prime: 
      find(num+p) 
      
n = int(input()) 
start = ['2', '3', '5', '7'] 
prime = ['1', '3', '7', '9'] 
for s in start: 
  find(s)