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")

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 07:35:58

EularProject 41:最长的n位Pandigital素数问题的相关文章

名家看后市:长阴破位不必慌

名家看后市:长阴破位不必慌 字体:大小换肤:收藏 2015-05-05 16:30:03 [同花顺博主张中秦 长阳上涨将喷薄而出]可以明确告诉所有人,大盘不会在这里阶段见顶!大盘冲顶过程即将开始,今天的长阴下跌就是冲顶开始的信号弹和分水岭!就短期而言,大盘一根长阴线落下,上涨反而踏实了,后市长阳上涨已经具备了生成条件,长阳线将随时喷薄而出!冲击沪指4800点! [同花顺博主股海上的灯塔 再度下探出现反弹]单纯从技术指标分析,沪市大盘日线图上的MACD指标线与KDJ指标线形成死叉共振,显示对应级别

【Android端 APP 启动时长获取】启动时长获取方案及具体实施

一.什么是启动时长? 1.启动时长一般包括三种场景,分别是:新装包的首次启动时长,冷启动时长.热启动时长 冷启动 和 热启动 : (1)冷启动:当启动应用时,后台没有该程序的进程,此时启动的话系统会分配一个新的进程给应用. (2)热启动:程序的进程依然存在,启动时通过已有进程启动进入到Activity显示页面的,就是热启动,或者从Android官网来看我们获取到的其实是温启动时长,就是Activity不存在的情况. (3)新装包的启动时长: 新装包的启动时长,预估是最长的,并且在5.0以下及5.

奇偶位互换

Problem Description 给定一个长度为偶数位的0,1字符串,请编程实现串的奇偶位互换. Input 输入包含多组测试数据:输入的第一行是一个整数C,表示有C测试数据:接下来是C组测试数据,每组数据输入均为0,1字符串,保证串长为偶数位(串长<=50). Output 请为每组测试数据输出奇偶位互换后的结果:每组输出占一行. Sample Input 2 0110 1100 Sample Output 1001 1100 1 #include <stdio.h> 2 #in

编译器是如何实现32位整型的常量整数除法优化的?[C/C++]

引子 在我之前的一篇文章[ ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#) ]里曾经提到过编译器在处理被除数为常数的除法时,是有优化的,今天整理出来,一来可以了解是怎么实现的,二来如果你哪天要写编译器,这个理论可以用得上.此外,也算我的一个笔记. 实例 我们先来看一看编译器优化的实例.我们所说的被除数为常数的整数除法(针对无符号整型, 有符号整型我们后面再讨论),指的是,对于unsigned int a, b, c,例如:a / 10, b

python操作redis之随机生成18位身份证号码

写一个随机生成身份证号的程序,输入多少条就产生多少个,?把产生完的数据写到redis里面,key用哈希类型?Xiaohei 410881198312031241 其中配置文件confsetting.py里的常量有: # 系统常量,包含: # LAST_NAME: 姓 # FIRST_NAME: 名 # STATE_CODE:全国大陆地区及编码 REDIS_IP = '172.16.2.163' RedisIp REDIS_PORT = 6379 REDIS_PASSWD = '222333' R

Project-Euler problem 1-50

最近闲的做了下Project Euler 上的题目,前面50题都比较简单,简单总结下.代码一般是Python和C/C++的 用Python 做这些题目简直是酸爽啊 一下代码可能不一定是我的,因为不知道论坛里面的回复不是永久的,所以我的代码有的丢了,可能找个和我的意思相近的代码.题目翻译是从 欧拉计划 | Project Euler 中文翻译站上面Copy 的表告我. Problem 1  Multiples of 3 and 5 10以下的自然数中,属于3和5的倍数的有3,5,6和9,它们之和是

算法笔试

1.把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向.   10  / \  6  14 / \ / \4  8 12 16 转换成双向链表4=6=8=10=12=14=16.  首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode{  int m_nValue; // value of node  BSTreeNode *m_pLeft; // left child of

ACM/ICPC 之 Kruskal范例(POJ1128(ZOJ1083))

最小生成树范例,Kruskal解法-以边为主体扩展最小生成树,需要利用并查集. ZOJ1203-Swordfish 题意:求n个给定平面坐标的城市中的一条平面距离上的最短路长(保留两位小数) 题解:这道题数据不是很大,用Kruskal和Prim等算法都能够做. Kruskal的算法思路是以边为主体扩展结点,即先选取权值最少的边,将两个不连通的端点加入到同一集合中(使其连通),舍去该边,接着找权值次小的,以此类推... 如果两个端点连通,则直接舍去该边. 因此可以先将所有边依据权值大小排序后,然后

计算机网络课后答案

计算机网络课后答案 第一章?概述 1-01?计算机网络向用户可以提供那些服务? 答:?连通性和共享 ? 1-02?简述分组交换的要点. 答:(1)报文分组,加首部 (2)经路由器储存转发 (3)在目的地合并 ? 1-03?试从多个方面比较电路交换.报文交换和分组交换的主要优缺点. ?????答:(1)电路交换:端对端通信质量因约定了通信资源获得可靠保障,对连续传送大量数据效率高. (2)报文交换:无须预约传输带宽,动态逐段利用传输带宽对突发式数据通信效率高,通信迅速. (3)分组交换:具有报文交