金蝉素数

程序地址:http://www.cheemoedu.com/exercise/21

问题描述:

某古寺的一块石碑上依稀刻有一些神秘的自然数。
专家研究发现:这些数是由1,3,5,7,9这5个奇数字排列组成的5位素数,同时去掉它的最高位与最低位数字后的3位数还是素数,同时去掉它的高二位与低二位数字后的一位数还是素数。因此人们把这些神秘的素数称为金蝉素数,喻意金蝉脱壳之后仍为美丽的金蝉。
试求出石碑上的金蝉素数。

注意:

它这里说的高二位与低二位数字后的一位数应该是去掉高位和低位的第二个后的三位数,不应该是一位数;

我的代码:

import math
import itertools
def prime(x):
    count=0
    for i in range(2,int(math.sqrt(x))+1):
        if x%i==0:
            count=1
    if count==0:
        return True
    else:
        return False
c=[]
for j in itertools.permutations([1,3,5,7,9],5):
    c.append(j)
for k in range(len(c)):
    l=c[k][0]*10000+c[k][1]*1000+c[k][2]*100+c[k][3]*10+c[k][4]
    m=c[k][1]*100+c[k][2]*10+c[k][3]
    n=c[k][0]*100++c[k][2]*10++c[k][4]
    if prime(l)==True and prime(m)==True and prime(n)==True:
      print l,

结果:

13597 15937 51973 53791 79531 91573

我的思路:

首先定义了一个prime函数,该函数判断传入的数是否为素数,然后根据itertools的permutations函数返回长度为5的所有的由1,3,5,7,9组成的不重复数放入列表中,其格式为[(1,3,5,7,9),(1,3,5,9,7)....],然后判断列表中每一个值是否满足原数,原数去掉最高位与最低位数字后的3位数和原数去掉高二位与低二位数字后的三位数同时都是素数,满足的话就是金蝉素数;

示例代码:

# 1. 生成 1,3,5,7,9 全排列, 每种排列是一个元组
# 2. 元组转换成数字 (例: 13579,357,159)
# 3. 检测3个数字是素数,如全是素数则是金蝉数

import math
def isPrimeNum(n):
    for k in range(2, int(math.sqrt(n) + 1)):
        if n % k == 0:
            return False
    return True

from itertools import permutations
for p in permutations([1,3,5,7,9], 5):
    # (3,5,7), (1,5,9), (1,3,5,7,9)
    for l in (p[1:-1], p[::2], p):
        s = reduce(lambda x, y: 10 * x + y, l)
        if not isPrimeNum(s):
            break
    else:
        print p

代码分析:

示例代码和我的大致相同,只不过它循环得到元组后又直接循环p[1:-1], p[::2], p即原数去掉最高位与最低位数字后的3位数,原数去掉高二位与低二位数字后的三位数和原数所组成的元组,而且我的是通过算术运算将元组转换为数字,而它的是使用reduce函数实现的;

总结:

itertools模块的permutations方法

语法格式:permutations(iterable [,r]):

创建一个迭代器,返回iterable中所有长度为r的项目序列,如果省略了r,那么序列的长度与iterable中的项目数量相同,它对数字进行全排列操作的效率比递归方式要好得多;

关于itertools模块可以参考这篇文章:http://www.cnblogs.com/cython/articles/2169009.html

时间: 2024-10-14 14:18:56

金蝉素数的相关文章

算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)

目录 1 好好学习 2 埃及分数 3 金蝉素数 4 横向打印二叉树 5 危险系数 6 公式求值   1 好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学.习".但是汤姆不认识汉字,他就想胡乱地贴成一行. 请你替小汤姆算一下,他这样乱贴,恰好贴对的概率是多少? 答案是一个分数,请表示为两个整数比值的形式.例如:1/3 或 2/15 等. 如果能够约分,请输出约分后的结果. 注意:不要书写多余的空格. 请严格按照格式

JAVA 水题

纯粹是让我来掌握熟练度的. 1.金蝉素数 某古寺的一块石碑上依稀刻有一些神秘的自然数. 专家研究发现:这些数是由1,3,5,7,9 这5 个奇数字排列组成的5 位素数,且同时去掉它的最高位与最低位数字后的三位数还是素数,同时去掉它的高二位与低二位数字后的一位数还是素数.因此,人们把这些神秘的素数称为金蝉素数,喻意金蝉脱壳之后仍为美丽的金蝉. 输出所有金蝉素数. ANSWER: 13597 53791 79531 91573 95713 package test; import java.util

Python 趣味百题

趣味整数 1 不重复的3位数 -易 2 水仙花数 -易 3 完全数 -中 4 相亲数 -中 5 黑洞数 -中 6 勾股数 -易 7 自守数 -易 8 3位反序数 -中 趣味素数 1 素数 -中 2 孪生素数 -中 3 金蝉素数 -中 4 可逆素数 -中 5 回文素数 -中 6 平方回文素数 -中 7 梅森尼数 -中 8 哥德巴赫猜想 -中 9 等差素数数列 -中 趣味图形 1 回型矩阵 -中 2 九九乘法表 -易 3 杨辉三角 -易 数学问题 1 天平秤物 -难 2 黑色星期五 -易 3 存钱问

177. 有限制的素数

177. [USACO Jan07] 有限制的素数 ★   输入文件:qprime.in   输出文件:qprime.out   简单对比 时间限制:1 s   内存限制:128 MB Farmer John 开始给奶牛们标记上素数的牌子,贝茜注意到了这一切,她对各种数的牌子很好奇. 请帮助贝茜算出从A到B (1 ≤ A ≤ B ≤ 4,000,000; B ≤ A + 1,000,000; B ≤ A + 2,000,000 ),其中包含数字D的素数的个数. 素数是只有两个两个约数(1 和 它

素数应用

输入一个数 分解尾三个数想乘 如果三个数其中有两个为素数->yes 否则no 1 //素数升级 2 //功能:??已知N是正整数,?它可拆写成三个正整数N1.N2和N3之和的形式N=N1+N2+N3.? 3 //请编程序打印出满足上式的全部组合,并当N1.N2和N3中至少有两个是素数时打印"YES"否则打印"NO".? 4 //如N = 5时输出:? 5 //5 = 1 + 1 + 3?????NO? 6 //5 = 1 + 2 + 2?????YES? 7

尝试用filter()函数删除1~100的素数

题目来自"廖雪峰的官方网站--Python教程",尝试用filter()函数删除1~100的素数: def is_prime(n):     if n <= 1:         return False     for s in range(2,n):         if n % s == 0:             return False     return True      print filter(is_prime,range(1,101) 素数的定义: 质数(

今天练习了一下用python写函数,就把它记录到博客上吧 冒泡排序和素数判断

第一个是判断素数,先上代码吧: 1 from math import sqrt 2 def is_prime(i): 3 if i == 2: 4 return True 5 elif i<2: 6 return False 7 elif i%2 == 0: 8 return False 9 else: 10 for n in range(3,int(sqrt(i)+1),2): 11 if i%n == 0: 12 return False 13 return True 这里用到了math包的

hdu 2136 筛法求素数以及一些细节上hxy做的优化

题目大意:每个数字都可以表示为一些素数的和,原因很显然:由算数基本定理可知,每一个数都可以表示为素数的乘积,自然也就可以表示为一些素数的和咯. 于是题目让我们求在这样的表示中出现的最大的素数是第几个素数. 思路:一开始想都没想,上了一个这样的代码. 1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 1000000

POJ 2689 Prime Distance(素数区间筛法--经典题)

大致题意:给定[L,R]区间,找出区间内的每个素数 数据范围 : 1<=L< R<=2,147,483,647) R-L <=1,000,000. R的数值太大,所以不能直接筛[0,R]的,要空间和时间优化,用到区间筛法,另外注意不能用int,因为R和L都是满int的,中间有很多细节处理会爆int的,还要注意1不是素数,所以在区间筛中要特判一下,是个易错的地方 //1160K 16MS C++ 1539B #include<cstdio> #include<ios