zoukankan      html  css  js  c++  java
  • 笔试题:能被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中了,所以在乘以这个最小质数就能整除这个非质数了。

  • 相关阅读:
    GO 语言使用copy 拷贝切片的问题
    ggplot 局部放大
    R语言hist重叠图作法
    illumina SNP 芯片转基因型矩阵
    Shell 变量嵌套
    JVM指令
    VUE—CLI学习
    Gradle 项目打开自动下载Zip问题及相关配置
    MySQL8服务无法启动,服务没有报告任何错误
    SpringMVC相关
  • 原文地址:https://www.cnblogs.com/ChangAn223/p/11182128.html
Copyright © 2011-2022 走看看