python数学篇(经典算法题)

每种高级语言几乎都会和数学打上交道,比如初期的实现1-100的素数,考研学者的数学和思维逻辑能力,到计算九皇宫的算法实现,这篇就写几个关于数学的python实现

1.斐波那契数列

# 斐波那契数列
sum = 0
num = 1
i = 0
while i < 10:
    nth = sum + num
    print(nth, end=" , ")
    # 更新值
    sum = num
    num = nth
    i+= 1

结果:
1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89
斐波那契数列意思第一个数加上第二个数=第三个数,以此类推

2.阿姆斯特朗数

# 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。 例如1^3 + 5^3 + 3^3 = 153。
# 1000以内的阿姆斯特朗数: 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407。
sum = int(input("输入一个数"))
sumlen = len(str(sum))
sumNum = 0
for i in str(sum):
    sumNum +=int(i) ** sumlen
if sum == sumNum:
    print("这个数的阿姆斯特郎数")
else:
    print("不是阿姆斯特郎数")

sums = int(input("请输入要查找到多少的阿姆斯特郎数"))
sum = 0
while True:
    num = 0
    n = len(str(sum))
    for i in str(sum):
        num += int(i)**n
    if sum == num:
        print("%d\t这是个阿姆斯特朗数"%sum)
    if sum >sums:
        break
    sum +=1

3.笛卡尔积

from itertools import product
for x,y,z,c in product(['a','b','c'],['d','e','f'],['m','n','a'],[2,3,1,4]):
    print(x,y,z,c)

意思为算出给定列表中全部可能的位数组合,这个答案的百度百科的,如果使用java编写笛卡尔积需要30-50行代码,python已经封装好了produch函数,使用for循环便可便利全部的笛卡尔积数

4.卡普雷卡

小编是在图书馆看到一本书上写的卡普雷卡数,当时觉得好玩,就拍了下来,星期一就想用python试一下实现

卡普尔卡数就是24502500一个位数为偶数的罗马数对半分开,(2450+2500)^ 2 == 24502500,下面是小编百度找到的解释:

传说数学家 卡普雷卡 (Kaprekar)偶然发现铁路旁的里程碑“3025”被雷击得一分为二:30与25.他敏锐地注意到:30+25=55,55^2=3025。 
现称这样具有分段和平特性的整数为卡普雷卡数。 
先探讨搜索4位卡普雷卡数的基础上引申至一般偶数位卡普雷卡数,并进一步拓广到2段和平方数。
 

下面是一个简单的找四位数中卡普雷卡数函数:

def Kaprekar1():
    for i in range(1000, 10000):
        a = int(str(i)[:2])
        b = int(str(i)[2:])
        c = (a + b) ** 2
        if i == c:
            print("(%d + %d) ** 2 == %d;" % (a, b, c))
Kaprekar1()

结果:
(20 + 25) ** 2 == 2025;
(30 + 25) ** 2 == 3025;
(98 + 1) ** 2 == 9801;

 得到给定位数的卡普雷卡数:

def Kaprekar2(len):
    if len % 2 == 0:
        len1 = 10 ** (len - 1)
        len2 = 10 ** len
        for i in range(len1, len2):
            lens = int(len / 2)
            a = int(str(i)[:lens])
            b = int(str(i)[lens:])
            c = (a + b) ** 2
            if i == c:
                print("(%d + %d) ** 2 == %d;" % (a, b, c))
    else:
        print("请输入偶数:")
Kaprekar2(2)

结果:
(2450 + 2500) ** 2 == 24502500;
(2550 + 2500) ** 2 == 25502500;
(5288 + 1984) ** 2 == 52881984;
(6048 + 1729) ** 2 == 60481729;
(9998 + 1) ** 2 == 99980001;#000省略了

那么除了偶数外还有奇数分段,如 88209 = (88+209)^ 2,如果这个数为5位,第一位2个,第二位3个

def Kaprekar3(len):
    len1 = 10 ** (len - 1)
    len2 = 10 ** len
    for i in range(len1, len2):
        lens = int(len // 2)
        a = int(str(i)[:lens])
        b = int(str(i)[lens:])
        c = (a + b) ** 2
        if i == c:
            print("(%d + %d) ** 2 == %d;" % (a, b, c))
Kaprekar3(7)

结果:
(494 + 1729) ** 2 == 4941729;
(744 + 1984) ** 2 == 7441984;

5,百钱百鸡

这个是中国古代的一个经典的数学题,就是说,有一百铜币,买一百只鸡,其中公鸡5铜币一只,母鸡3铜币一只,小鸡一铜币三只,

要求每种鸡必须购买一只,求出一共有几种买法

答案如下:大家不如先自己做一下再看答案呢

x = 1
y = 1

for i in range(1,21):
    for j in range(1,34):
        z = 100 - (x+y)
        if (z %3 == 0) and (x * 5 + y *3 +z/3 ==100):
            print('%s公鸡 , %s母鸡 , %s小鸡 '%(x,y,z))
        y +=1
    y =1
    x+=1

6,猴子吃桃问题

# 猴子有一天摘了很多桃子,第一天吃了一半觉得不够就又多吃了一个,第二天也是,一直到第十天,发现就剩一个了

问猴子第一天摘了多少桃子

x2 = 1
for i in range(9):
    x1 = (x2 + 1) * 2
    x2 = x1
print x2

7,约瑟夫生者死者小游戏
# 30 个人在一条船上,超载,需要 15 人下船。
# 于是人们排成一队,排队的位置即为他们的编号。
# 报数,从 1 开始,数到 9 的人下船。
# 如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
以下是菜鸟教程的做法

people = {}
for x in range(1, 31):
    people[x] = 1
print(people)
check = 0
i = 1
j = 0
while i <= 31:
    if i == 31:
        i = 1
    elif j == 15:
        break
    else:
        if people[i] == 0:
            i += 1
            continue
        else:
            check += 1
            if check == 9:
                people[i] = 0
                check = 0
                print("{}号下船了".format(i))
                j += 1
            else:
                i += 1
                continue
 

 

 

  • 9
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经典算法是在计算机科学中被广泛应用的一类算法,它们的设计和实现经过了长时间的发展和改进,被证明是高效且可靠的。在Python中,有许多经典算法可以用于数学。 其中一个经典算法是欧几里得算法(Euclidean algorithm),它用于求两个数的最大公约数。在Python中,可以使用math模块中的gcd()函数来实现。这个函数接受两个整数参数,并返回它们的最大公约数。例如,gcd(24, 36)将返回12,因为24和36的最大公约数是12。 另一个经典算法是素数筛法(Sieve of Eratosthenes),它用于快速找出一定范围内的所有素数。在Python中,可以通过使用嵌套的for循环和一个布尔类型的列表来实现。首先,创建一个布尔类型的列表,表示范围内的数字是否为素数。然后,从2开始遍历列表,将它的倍数标记为非素数。最后,遍历列表,返回所有为素数的数字。这个算法的时间复杂度是O(nlog(logn)),其中n是范围的上限。 除了这些经典算法之外,Python还提供了许多其他的数学函数和方法,如阶乘函数(factorial())、幂函数(pow())、取整函数(int())、四舍五入函数(round())等。这些函数和方法可以方便地进行数学计算和操作。 总结来说,Python中的经典算法在求解数学时非常有效和方便。无论是求最大公约数、找素数还是进行其他数学运算,Python提供了丰富的函数和方法,使得数学计算更加简便和快捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值