CTF编程题-三羊献瑞(实验吧)解题随记

发布时间:2019-05-22 22:18:33编辑:auto阅读(2279)

    题目如下。解题步骤参考的是https://cloud.tencent.com/developer/news/373865中作者的思路。

    1.首先,两个四位数相加等于一个五位数,那么这个五位数的第一位必定是1,也就是“三”=1,。

    2.继续分析“祥”+“三”,若是“祥”(8),“三”为1,那么低位必定有进位(才能结果为五位数);若是“祥”(9),假如低位没有进位,则也满足条件,而低位有进位那么“羊”为1,这就不符合题目要求(“三”=1,不同的汉字代表不同的数字)。所以总结下来,“祥”可能为9或8,满足所有条件的情况下,“羊”必定为0。

    3.接下来可以看到“瑞”+“羊”并没有等于“瑞”,而是等于另外一个数字“生”。因为“羊”=0,“瑞”在2~9范围内,两者相加只可能等于“瑞”,而此处不是,则低位必然有进位。接下来可以知道“瑞”+“羊”+1不可能等于10,即“生”=0(与“羊”=0冲突)。那么“瑞”+“羊”并没有加进位,结合上一步的分析【若是“祥”(9),假如低位没有进位,则也满足条件】得知“祥”=9。

    4.“生”-“瑞”=1,“生”最大为7,因为9被“祥”占用。那么“生”最小为3。

    综上,瑞(2~7),生(3~8),“辉”、“献”、“气”的范围均为2~8。

    接下来就是编程了,代码同样也是参考作者的。

     1 #encoding:utf-8
     2 #     祥9 瑞d[2] 生d[1] 辉d[0]
     3 #  +  三1 羊0    献d[4] 瑞d[2]
     4 #------------------------------
     5 # 三1 羊0 生d[1] 瑞d[2] 气d[3]
     6 import random
     7 #随机0-9的数组
     8 def shuzu():
     9     b1 = []
    10     while True:
    11         j=random.randint(2,8) 
    12         if j not in b1:
    13             b1.append(j)
    14         if(b1.__len__()==5):
    15             break
    16     return b1
    17 #
    18 def shuzu1():
    19     while True:
    20         b2=shuzu()
    21 #"生"-"瑞"=1,瑞(2-7),生(3-8)
    22         if(b2[1]-b2[2]==1 and b2[1]!=2 and b2[2]!=8):
    23             break
    24     print(b2)
    25     return b2
    26 while True:
    27 #d生成随机的数组
    28         d=shuzu1()
    29 # 祥c 瑞d[2] 生d[1] 辉d[0]
    30         xrsh=9000+d[2]*100+d[1]*10+d[0]
    31 #三a 羊b 献d[4] 瑞d[2]
    32         syxr=1000+d[4]*10+d[2]
    33 #三a 羊b生d[1] 瑞d[2] 气d[3]
    34         sxsrq=10000+d[1]*100+d[2]*10+d[3]
    35 #如果等式成立,就终止循环,输出数字
    36         if(sxsrq==xrsh+syxr):
    37             print("________________")
    38             print("  祥瑞生辉:",xrsh)
    39             print("+ 三羊献瑞:",syxr)
    40             print("三羊生瑞气:",sxsrq)
    41             break

    代码运行时间也是随机的。

     

关键字