1. 程式人生 > >EularProject 41:最長的n位Pandigital素數問題

EularProject 41:最長的n位Pandigital素數問題

mar digits stat completed tle pop += content ges

Pandigital prime
Problem 41
We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once. For example, 2143 is a 4-digit pandigital and is also prime.
What is the largest n-digit pandigital prime that exists?
Answer:
7652413
Completed on Thu, 30 Jul 2015, 08:32
Go to the thread for problem 41 in the forum.

首先發現3k和3k-1位的ppandigital肯定能被3整除。所以就剩下1,4,7,10。13。。。推測題意應該是9以內的所以就試試7咯,代碼是前面代碼擴展,就出結果了
http://blog.csdn.net/zhangzhengyi03539/article/details/43501225
http://blog.csdn.net/zhangzhengyi03539/article/details/47057049

__author__ = ‘zhengyi‘
import math
from functools import reduce
def IsPrime(x):
    if x==1:
        return
False k=int(math.sqrt(x))+1 for i in range(2,k): if x%i==0: return False return True def reducefunc(x,y): return 10*x+y def func1(x): i=1 val=1 while val<x: i+=1 val*=i if val==x: return (1,i,0) else: step=val//i k=x//step return
(k,i-1,x%(k*step)) def func2(x): lst=[] result=func1(x) while result[2]!=0: lst.append(result[0:2]) result=func1(result[2]) lst.append(result[0:2]) return lst def func3(x,clst): result=[] count=len(clst) lst=func2(x) length=len(lst) for i in range(0,length): if i<length-1: delta=lst[i][0] position=lst[i][1]+1 while count>position: result.append(clst[-count]) del clst[-count] count-=1 result.append(clst[-position+delta]) del clst[-position+delta] count-=1 else: delta=lst[i][0]-1 position=lst[i][1]+1 while count>position: result.append(clst[-count]) del clst[-count] count-=1 result.append(clst[-position+delta]) del clst[-position+delta] count-=1 while count>0: result.append(clst[-1]) del clst[-1] count-=1 return result charlist=[i for i in range(7,0,-1)] k=0 while True: k+=1 temp=func3(k,charlist.copy()) data=reduce(reducefunc,temp) if IsPrime(data): print(data) break print("Get it")

EularProject 41:最長的n位Pandigital素數問題