100天学习mojo-day5构造程序逻辑

110 阅读5分钟

欢迎关注github项目,100天Mojo从新手到大师

github.com/wusiyaodiud…

构造程序逻辑

本章为大家整理了一些经典的案例和习题,希望通过这些例子,一方面帮助大家巩固之前所学的Mojo知识,另一方面帮助大家了解如何建立程序中的逻辑以及如何运用一些简单的算法解决现实中的问题。

经典案例

1.寻找水仙花数

说明:水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,每位数字的3次幂之和等于该数本身。例如:153 = 1^3 + 5^3 + 3^3。

for num in range(100, 1000):
    var low:Int = num % 10
    var mid:Int = num //10 % 10
    var high:Int = num //100
    if num == low ** 3 + mid ** 3 + high ** 3:
        print(num)

在上面的代码中,通过整除和求模运算分别找出了一个三位数的个位、十位和百位,这种小技巧在实际开发中还是常用的。类似地,还可以用同样的方法计算四叶玫瑰数(指一个四位数,它的各位数字的四次方和等于其本身)

for num in range(100, 1000):
    var low:Int = num % 10
    var mid:Int = num //10 % 10
    var high:Int = num //100 % 10
    var t:Int = num // 1000
    if num == low ** 4 + mid ** 4 + high ** 4 + t ** 4:
        print(num)

2.百钱白鸡

说明:百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?

# 百钱白鸡
for x in range(0, 20):
    for y in range(0, 33):
        z = 100 - x - y
        if 5 * x + 3 * y + z / 3 == 100:
            print('公鸡:'+ str(x) + ',母鸡:' + str(y) + ',小鸡:' + str(z))

上面使用的方法叫做穷举法,也称为暴力搜索法,这种方法通过一项一项的列举备选解决方案中所有可能的候选项并检查每个候选项是否符合问题的描述,最终得到问题的解。这种方法看起来比较笨拙,但对于运算能力非常强大的计算机来说,通常都是一个可行的甚至是不错的选择,而且问题的解如果存在,这种方法一定能够找到它。

3.Craps赌博游戏

说明:CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简单的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;其他点数玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数,玩家继续要骰子,直到分出胜负。

from python import Python
let rd = Python.import_module("random") # TODO 没用明白mojo的random库,暂时还是先用Python的
var needs_go_on:Bool = False
first = rd.randint(1, 6) + rd.randint(1, 6)
print('玩家摇出了' + str(first))
if first == 7 or first == 11:
    print('玩家胜!')
elif first == 2 or first == 3 or first == 12:
    print('庄家胜!')
else:
    needs_go_on = True

while needs_go_on:
    current = rd.randint(1, 6) + rd.randint(1, 6)
    print('玩家摇出了' + str(current))
    if current == 7:
        print('庄家胜')
        needs_go_on = False
    elif current == first:
        print('玩家胜')
        needs_go_on = False

练习题目

1.斐波那契数列

说明:斐波那契数列(Fibonacci sequence),又称黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)在《计算之书》中提出一个在理想假设条件下兔子成长率的问题而引入的数列,所以这个数列也被戏称为"兔子数列"。斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,形如:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...。斐波那契数列在现代物理、准晶体结构、化学等领域都有直接的应用。

var a:Int = 0
var b:Int = 1

for _ in range(20):
    a, b = b, a + b
    print(a)

2.完美数

说明:完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和(即因子函数)恰好等于它本身。例如:6(6=1+2+36=1+2+3)和28(28=1+2+4+7+1428=1+2+4+7+14)就是完美数。完美数有很多神奇的特性,有兴趣的可以自行了解。

# 找出1~9999之间的所有完美数
import math
for num in range(2, 10000):
    var result:Int = 0
    for factor in range(1, int(math.sqrt(num)) + 1):
        if num % factor == 0:
            result += factor
            if factor > 1 and num // factor != factor:
                result += num // factor
    if result == num:
        print(num)

3.素数

说明:素数指的是只能被1和自身整除的正整数(不包括1)。

# 输出2~99之间的素数
import math
for num in range(2, 100):
    var is_prime:Bool = True
    for factor in range(2, int(math.sqrt(num)) + 1):
        if num % factor == 0:
            is_prime = False
            break
    if is_prime:
        print(num)