Python 官网:https://www.python.org/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
这是我参加“14天阅读挑战赛”第二周第2篇
点击查看“14天阅读挑战赛”详情
“判断两个长度不同(数位不等)的整数能否顺序拼接成最大的一个整数”,在码上一篇学习笔记“最大整数”(点击“最大整数”跳转笔记查看详情)代码的时候,有这样的需求。伤些脑力,耗些时光,最终还是达成目的,记此笔记,焯个印记。
问题分析:要使拼接的整数大,大的数字放在前面就好。直接比较,大数在前拼接就是最大。这么简单?对于数位长度相等的整数,的确如此。数位不等的情况不好打理,我屡试不爽,怎么修改代码,都有遗漏的情况。
经过枚举举证,仔细观察规律,就是找不到一个通用的算法模型,对长度不一的整数进行遍历比对,判其小大。在推敲过程中,用上了把整数整成字符串的方法,遍历逐位比较int(string)数字大小,比较顺手。
代码
def isbig(num, num2):
''' 判定两个整数顺序拼接出最大整数 '''
a, b = str(num), str(num2)
if num < num2:
n = len(a)
else:
n = len(b)
for i in range(n):
if int(a[i]) > int(b[i]):
return True
else:
return False
67 6
63 6
两组整数,得出了一样的结果。63 6显然应该是False,这只遍历比较数位少的“算法”是行不通的。如果按长的整数遍历数位,长的后面的数位都与末位相比。那把短整数未重复,使长度一样,遍历比对哩。试试……
代码
if (n1 := len(a)) > (n2 := len(b)):
b += b[-1]*(n1-n2)
else:
a += a[-1]*(n2-n1)
好像对了,但66 6却,哪个在前都是一样。但却来了个None。
if a == b: #拼成数位一致后的比较。
return True
加上一行代码。看看……
随机10组整数:
/sdcard/qpython $ python 1026.py
1 5
1, 5, is False
8 7
8, 7, is True
16 55
16, 5, is False
41 44
41, 4, is False
8 6
8, 6, is True
37 44
37, 4, is False
800 545
80, 545, is True
555 365
5, 365, is True
487 777
487, 7, is False
956 869
956, 869, is True
再炼10组整数
/sdcard/qpython $ python 1026.py
1700 1823
170, 1823, is False
9801 2433
9801, 243, is True
16666 50545
16, 50545, is False
42222 15866
42, 15866, is True
1133 4713
113, 4713, is False
74889 91111
74889, 91, is False
51981 47988
51981, 4798, is True
47777 14138
47, 14138, is True
9667 4388
9667, 438, is True
70700 26111
70700, 261, is True
用拉长短整数的办法解决了遍历比对数位的问题,完成了两个整数顺序拼接是否最大的判定。
mypycolor完整源码(源码较长,点此跳过源码)
#!/sur/bin/nve python
# coding: utf-8
'''
Author:梦幻精灵_cq
date:2022-10-26
'''
def random_nums(n, f=1, b=3):
''' 随机数列生成,n数列元素,k每数字最大位数 '''
from random import choices, shuffle
digits = list('0987654321')
tem = []
position = list(range(f, b+1))
for i in range(n):
shuffle(position)
k = choices(position, k=1)
while True:
shuffle(digits)
num = choices(digits, k=k[0])
if num[0] != '0':
break
tem.append(int(''.join(num)))
return tem
def isbig(num, num2):
''' 判定两个整数顺序拼接出最大整数 '''
a, b = str(num), str(num2)
if (n1 := len(a)) > (n2 := len(b)):
b += b[-1]*(n1-n2)
else:
a += a[-1]*(n2-n1)
if a == b: #拼成数位一致后的比较。
return True
for i in range(len(a)):
if int(a[i]) > int(b[i]):
return True
elif int(a[i]) < int(b[i]):
return False
if __name__ == '__main__':
for i in range(10):
nums = list(map(str, random_nums(2, 2, 5)))
m, n = nums[:2]
print(f"{m}, {n}, is {isbig(m, n)}")
来源:老齐教室
全栈领域优质创作者——寒佬(还是国内某高校学生)好文:《非技术文—关于英语和如何正确的提问》,“英语”和“会提问”是学习的两大利器。
【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
靠谱程序员的好习惯