文章目录
- 前言
- 一、约瑟夫问题
- 1.问题描述
- 2.代码
- 二、斐波那契数列
- 1.问题描述
- 2.代码
- 三、最大公约数与最小公倍数
- 1.问题描述
- 2.代码
- 四、N位自幂数(水仙花数)
- 1.问题描述
- 2.代码
- 五、汉明距离
- 1.问题描述
- 2.代码
- 六、矩阵转置
- 1.问题描述
- 2.代码
- 注意
前言
这篇文章是介绍作者在学习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程序设计》课程,转载、借鉴请注明出处。