COMP9021 Principles of Programming Lab3

1. Finding particular sequences of prime numbers

Write a program consecutive_primes.py that finds all sequences of 6 consecutive prime 5-digit numbers, say (a,b,c,d,e,f), with b = a+2, c = b+4, d = c+6, e = d+8, and f = e+10. So a, b, c, d and e are all 5-digit prime numbers and no number between a and b, between b and c, between c and d, between d and e, and between e and f is prime.

from math import sqrt

difference = [0, 2, 6, 12, 20, 30]
#给定第一个五位数,后续数字与第一个数的差值

def is_prime(n):
#判断是否是质数,这里没有考虑1,因为本题不需要
    if n % 2 == 0:
        return False
    for i in range(3, round(sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

solution = []
for i in range(10000, 100000):
    candidate = [0] * 6
    flag = 0
    for j in range(len(difference)):
        candidate[j] = difference[j] + i
        if not is_prime(candidate[j]):
            break
    if is_prime(candidate[-1]):
        for e in range(candidate[0], candidate[5] + 1, 2):
        #判断一组candidate之间的数是否存在质数
            if is_prime(e) and e not in candidate:
                flag = 1
        if not flag:
            solution.append(candidate)

for i in solution:
    for e in i:
        print(e, end = ' ')
    print()

2. Finding particular sequences of triples

Write a program triples_1.py that finds all triples of positive integers (i, j, k) such that i, j and k are two digit numbers, no digit occurs more than once in i, j and k, and the set of digits that occur in i, j or k is equal to the set of digits that occur in the product of i, j and k.

min_n1 = 10
max_n1 = 76
max_n2 = 87
max_n3 = 98
#三个两位数的成绩,规定三个数从小到大分别是n1, n2, n3。由于使用数字不能重复,所以有上述的最小和最大值

for n1 in range(min_n1, max_n1 + 1):
    used1 = set()
    used1.add(n1 // 10)
    used1.add(n1 % 10)
    if len(used1) != 2:
        continue
    #如果n1的两个数字重复,则在set中只会记录一个数,这样的情况被自动排除
    for n2 in range(n1 + 1, max_n2 + 1):
        used2 = used1.copy()
        #在n1的基础上每次寻找能n2都重新创建一个set,避免指针错误造成程序的bug
        used2.add(n2 // 10)
        used2.add(n2 % 10)
        if len(used2) != 4:
            continue
        for n3 in range(n2 + 1, max_n3 + 1):
            used3 = used2.copy()
            used3.add(n3 // 10)
            used3.add(n3 % 10)
            if len(used3) != 6:
                continue
            multiple = n1 * n2 * n3
            flag = 0
            
            if len(str(multiple)) != 6:
                flag = 1
            for i in str(multiple):
                if int(i) not in used3:
                    flag = 1
                else:
                    used3.remove(int(i))
            if not flag:
                print('%d * %d * %d = %d' % (n1, n2, n3, multiple))

3. Finding special triples of the form (n, n + 1, n + 2)

Write a program triples_2.py that finds all triples of consecutive positive three-digit integers each of which is the sum of two squares, that is, all triples of the form (n, n + 1, n + 2) such that:
--n, n+1 and n+2 are integers at least equal to 100 and at most equal to 999;
--eachofn,n+1andn+2isoftheforma2+b2.

from math import sqrt
from collections import defaultdict

up = round(sqrt(999)) + 1
#因为要寻找一个由平方数组成的三位数,所以最大平方数可以计算,限定这个上限是up
l = defaultdict(list)

for i in range(0, up):
    for j in range(i + 1, up):
        total = i ** 2 + j ** 2
        if total < 1000 and total > 99:
            l[total] = (i, j)
 #创建一个字典,key是一个三位数,value是构成他的两个平方数的tuple,因为题中可以寻找任意平方数的组合,所以字典中只保存一个,新出现的覆盖前面的内容

three_digit = set()
for i in l.keys():
    three_digit.add(int(i))
three_digit = sorted(list(three_digit))
#按照从小到大顺序创建一个可以由两个平方数求和表示的三位数list

result = []
for i in three_digit:
    if (i + 1) in three_digit and (i + 2) in three_digit:
        result.append((i, i + 1, i + 2))
#如果连续三个三位数都可以表征为两个数的平方和,则加入到list中

while result:
    print(result[0],'(equal to (%d^2+%d^2, %d^2+%d^2, %d^2+%d^2)) is a solution.' % \
          (l[result[0][0]][0], l[result[0][0]][1], l[result[0][1]][0], l[result[0][1]][1], l[result[0][2]][0], l[result[0][2]][1]))
    result.pop(0)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容