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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值