EularProject 41:最长的n位Pandigital素数问题

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")
posted @ 2018-01-24 12:14  zhchoutai  阅读(136)  评论(0编辑  收藏  举报