zoukankan      html  css  js  c++  java
  • 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")
  • 相关阅读:
    函数-列表生成式
    函数-闭包
    函数-参数
    函数-装饰器
    函数-函数递归
    函数-高阶函数
    函数-命名空间
    函数-匿名函数
    模块-shutil
    在 Android 5.1.1 执行 remount system failed 解决方法
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8341023.html
Copyright © 2011-2022 走看看