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

来源:互联网 发布:数据导出 编辑:程序博客网 时间:2024/06/06 14:04

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 mathfrom functools import reducedef 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 Truedef reducefunc(x,y):    return 10*x+ydef 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 lstdef 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 resultcharlist=[i for i in range(7,0,-1)]k=0while True:    k+=1    temp=func3(k,charlist.copy())    data=reduce(reducefunc,temp)    if IsPrime(data):        print(data)        breakprint("Get it")
0 0
原创粉丝点击