使用python解决一些小问题

求得两个正整数的最大公约数

  1. 约数概念:a%b=0,表明a是b的倍数,b是a的约数。
  2. 最大公约数概念:如果一个数既是a又是b的约数,那么我们就把这个数叫着a和b的公约数,如果这个数在a b的所有公约数里为最小,那这个数就是最大公约数。
  3. 比如12,16的公约数有1、2、4,两者的最大公约数为4

该问题的解

def ged(x,y):
    min_=y if x>y else x
    for i in range(1,min_+1):	# a,b的最大公约数可能是a,b其中的一个,所以最大公约数必须小于ab之中的最小值
        if x% i==0 and y% i ==0:
            ged=i
    return ged
ged(12,16),ged(12,6)
>>> 4,6

求得两个正整数的最小公倍数

  1. 倍数概念:a%b=0,表明a是b的倍数,b是a的约数。
  2. 如果一个数既是a又是b的倍数,那么我们就把这个数叫着a和b的公倍数,如果这个数在a b的所有公倍数里为最小,那这个数就是最小公倍数
  3. 比如12,16的公倍数有48,96,…(无限多个),两者的最小公倍数为48

该问题的解

def lcm(x,y):
    greater=x if x>y else y
    while True:
        if (greater%x==0)and (greater%y==0):
            lcm=greater
            break
        greater+=1
    return lcm
lcm(5,8)
>>> 40    

python中的%代表取余,在很多算法中该运算符号都起到了相当重要的作用
a%b=0,表明a、b之间可能存在三种关系:
1、a=0
2、a=b
3、a=kb(k为常数)

五个数能够组成多少互相不相同的三位数

这是一个排列组合问题,python的内置模块itertools中含有相关函数,能够很好的解决该问题

函数返回类型相当于
itertools.permutations('ABCD', 2)itertools.permutations(可通过迭代访问其中元素,也可以通过类型转换函数转换类型,如list()) A 4 2 = 12 A_4^2=12 A42=12,即排列数
itertools.combinations('ABCD', 2)itertools.combinations C 4 2 = 6 C_4^2=6 C42=6,即组合数

permutations()

itertools.permutations(iterable, r=None)

r表示子序列的长度,默认值为len(iterable)

combinations()

itertools.combinations(iterable,r=None)

r表示子序列的长度,默认值为len(iterable)

该问题的解(排列数)

r=permutations([3,4,5,6,7],3)
rr=list(r)
len(rr)
>>> 60
for j in range(1,7):
    print(rr[j*10-10:j*10])
>>> [(3, 4, 5), (3, 4, 6), (3, 4, 7), (3, 5, 4), (3, 5, 6), (3, 5, 7), (3, 6, 4), (3, 6, 5), (3, 6, 7), (3, 7, 4)]
[(3, 7, 5), (3, 7, 6), (4, 3, 5), (4, 3, 6), (4, 3, 7), (4, 5, 3), (4, 5, 6), (4, 5, 7), (4, 6, 3), (4, 6, 5)]
[(4, 6, 7), (4, 7, 3), (4, 7, 5), (4, 7, 6), (5, 3, 4), (5, 3, 6), (5, 3, 7), (5, 4, 3), (5, 4, 6), (5, 4, 7)]
[(5, 6, 3), (5, 6, 4), (5, 6, 7), (5, 7, 3), (5, 7, 4), (5, 7, 6), (6, 3, 4), (6, 3, 5), (6, 3, 7), (6, 4, 3)]
[(6, 4, 5), (6, 4, 7), (6, 5, 3), (6, 5, 4), (6, 5, 7), (6, 7, 3), (6, 7, 4), (6, 7, 5), (7, 3, 4), (7, 3, 5)]
[(7, 3, 6), (7, 4, 3), (7, 4, 5), (7, 4, 6), (7, 5, 3), (7, 5, 4), (7, 5, 6), (7, 6, 3), (7, 6, 4), (7, 6, 5)]

判断某个数是否为质数

质数:一个大于1的自然数,除了1和它本身不能被其他自然数整除

该问题的解

def isprime_num(num):
    if num>1:
        for i in range(2,num):
            if (num%i)==0:	# 如果num%i==0表明num=ki(k为常数)
                print(num,'不是质数')
                break
        else:  
            print(num,'是质数')
    else:       
        print(num,'是质数')
isprime_num(7) 
>>> 7是质数

上面我们已经知道:a%b=0的三种情况,根据质数的概念我们可以舍去前两种情况,剩下的第三种情况从这个角度我们或许可以这样理解质数:除了1和它本身,质数不再是任何一个正整数的倍数

判断某个年份是否为闰年

闰年:能被4整除但是不能被100整除的年份(普通闰年)或者能被400整除的年份(世纪闰年)

该问题的解

def isleap_year(year):
    if ((year%4==0)and(year%100!=0))or(year%400==0):
        print(f'{year}是闰年')
    else:
        print(f'{year}不是闰年')
isleap_year(2000)
>>> 2000是闰年        

生成九九乘法表

主要考虑制表符’\t’的使用

该问题的解

for i in range(1,10):
	for j in range(1,i+1):
		print(f'{i}*{j}={i*j}',end='\t')
	print('')	

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夺笋123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值