经典编程问题的Python解法(入门难度)


前言

这篇文章是介绍作者在学习Python编程过程中自己悟到并总结的比较精简的习题解法,文章会持续更新。


一、约瑟夫问题

1.问题描述

N个人围成一圈,从第一个开始报数,第M个将出列,最后剩下一个,其余人都将离开。求最后剩下的人是原来的第几号?

2.代码

代码如下:

M, N = map(int, input().split())	# 报数和总人数
lst = list(range(1, N+1))			# 初始化列表,每个人有一个编号
start = 0
for i in range(N-1):
    out = (start + M - 1) % (N - i)	# 取模
    start = out
    del lst[out]
print(lst[0])

二、斐波那契数列

1.问题描述

斐波那契数,亦称之为斐波那契数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……,这个数列从第3项开始,每一项都等于前两项之和。求大于输入数n的最小斐波那契数。

2.代码

代码如下:

n = int(input())
a = b = 1			# 初始化前两项
while b <= n:
    a, b = b, a + b	# 利用Python的同步赋值
print(b)

三、最大公约数与最小公倍数

1.问题描述

求两个给定正整数的最大公约数和最小公倍数。

2.代码

代码如下:

m, n = map(int, input().split())
a, b = m, n
while a % b:
    a, b = b, a % b			# 利用辗转相除法计算
gcd = b
lcm = m*n//b				# 最小公倍数*最大公约数=两数乘积
print(f'{gcd} {lcm}')

四、N位自幂数(水仙花数)

1.问题描述

自幂数:一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 例如:153=1×1×1+5×5×5+3×3×3。

2.代码

代码如下(解法一):

N = int(input())			# 输入位数
x = 10 ** (N-1)
while x < 10 ** N:
    result = 0
    for i in range(1, N+1):		# 从个位到最高位的通式
        result += (x%(10**i) // (10**(i-1))) ** N
    if x == result:
        print(x)
    x += 1

这种做法虽然适合不确定位数的情况,但是计算耗时不少。

解法二:

N = int(input())			# 输入位数
for x in range(10 ** (N-1), 10 ** N):
	if x == sum(list(int(i) ** N for i in str(x))):
		print(x)

利用字符串来求解,整体代码比较简单。


五、汉明距离

1.问题描述

两个整数间的汉明距离指的是这两个数对应二进制位不同的位置的数目。输入两个整数x, y, 0<=x, y<=2^31。输出x, y的汉明距离。

2.代码

代码如下:

a, b = map(int, input().split())
print(bin(a ^ b).count('1'))			# 借助异或的位运算,得到1的数量。

六、矩阵转置

1.问题描述

从键盘输入一个m(2<=m)*n(2<=n)阶的矩阵,编程输出它的转置矩阵。

2.代码

代码如下:

m, n = map(int, input().split())
matrix1 = []
for _ in range(m):
    row = list(map(int, input().split()))
    matrix1.append(row)
matrix2 = [[row[col] for row in matrix1] for col in range(n)]	# 这里是精髓
for i in range(n):
    print(' '.join(map(str, matrix2[i])))

注意

多数题目来自MOOC上的浙江大学翁恺老师主持的《Python程序设计》课程,转载、借鉴请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值