笔试题:能被1~10同时整除的最小整数是2520,问能被1~20同时整除的最小整数是多少?

题目:

能被1~10同时整除的最小整数是2520,问能被1~20同时整除的最小整数是多少?

友情提示:看最佳答案直接翻到最后。

拿到题时自己的思考如下:

先将1~20分一半,只看11~20,这个数既然能整除11~20,则必然能整除1~10。现在将11~20这十个数中能被2,3,5整除的数循环除2,3,5,将这个公约数提出来。示例如下:

列表1:[11,12,13,14,15,16,17,18,19,20] 存放折一半之后的数
列表2:[2,3,5] 存放被整除的数,这里只需要2,3,5即可,如果是1~30的最小公倍数,这个列表里还有7
列表3:[] 开始是空,用来存放每一遍整除的2或3或5

列表1依次对列表2的每个数进行整除(这里只有列表1能被整除的数才进行整除,不能被整除的则不变)

叙述步骤如下:

(1).列表1对列表2的第一位数2进行整除结果:[11,6,13,7,15,8,17,9,19,10],因为现在的列表1中有数能被2整除,故列表3现在要加一个整除的数2,列表3:[2]
(2).同上,现在的列表1[11,6,13,7,15,8,17,9,19,10]对列表2第个数进行整除,结果:[11,2,13,7,5,8,17,3,19,10],同理列表3新家元素3,列表3:[2,3]
(3).同上,对第3个数进行整除,结果:列表1[11,6,13,7,3,8,17,9,19,2],列表3新家元素5,列表3:[2,3,5]
(4).经过第一遍整除之后,开始第二遍,同上,结果:列表1[11,2,13,7,3,4,17,9,19,1],列表3:[2,3,5,2]
(5).如此循环,需要注意的时,每当列表1中的每一个数都不能被列表2中的某个数整除时,需要从列表2中移除这个数。
(6).最终,列表2为空,停止循环,列表1:[11, 1, 13, 7, 1, 1, 17, 1, 19, 1],列表3:[2, 3, 5, 2, 3, 2, 2],将这两个列表中的每个数相乘就得到了最小公倍数。

python代码如下:

list1 = [ i for i in range(11,21)]
list2 = [2,3,5]
list3 = []
while 1:
	for i in list2:
		flag = 0
		for j in range(10):
			if list1[j]%i==0:
				list1[j] = list1[j]//i
				flag = 1
		if flag:
			list3.append(i)

	if not flag:
                list2.remove(i)
	
        if not list2:
		break
			
print(list1,list3)        #最后记得将列表1,3中的每个元素相乘。

运行结果:

更新:可以先把11~20里的所有质数找出来单独存放以减少列表1中的元素个数。进而减少判断整除运算次数。

如有更好的方法请大佬留言!万分感谢!!!


最佳方法!!!

看了一些博客,发现了这个方法。瞬间嫌弃自己的方法,还是自己太菜了。

先来看代码,代码思路分析在下边。

# 判断质数
def is_prime(x):
	for i in range(2,x//2+1):
		if x % i ==0:
			return False
	return True
	
# 找出所有质数
def get_primeList(m):
	prime_list = []
	for i in range(2,m+1):
		if is_prime(i):
			prime_list.append(i)
	return prime_list

# 将非质数分解成质数,找出组成这个非质数的最小质数
def to_prime(y):
	for j in range(2,y//2+1):
		if y % j == 0:
			return j

def solution(n):
	list = [i for i in range(2,n+1)]
	prime_list = get_primeList(n)
	s = 1
	for prime in prime_list:
		list.remove(prime)
		s *= prime
	for i in list:
		s = s if (s % i == 0) else s * to_prime(i)
	return s

print(solution(20))

结果:

思路:

1.先把列表list所有的质数找出来,以减少列表长度。将这所有质数相乘得到初始值S。列表list中剩下的全是非质数。
2.依次读出列表list的值作为当前值i,因为i是非质数,所以我们要找出组成这个非质数的最小质数j
3.使用三元式公式得到新的S的值:新的S = 初始值S ? 初始值S能否整除当前值i : 初始值S * 组成i的最小质数j
4.循环2.3步,最后得到最小倍数。

为什么三元式中,若不能整除非质数时 是乘以 组成非质数 的 最小那个质数呢?因为后面的质数都在最开始的那个S0中了,所以在乘以这个最小质数就能整除这个非质数了。

原文地址:https://www.cnblogs.com/ChangAn223/p/11182128.html