繁体   English   中英

小于最大数的倍数

[英]Number of multiples less than the max number

对于SingPath上的以下问题:

Given an input of a list of numbers and a high number, 
return the number of multiples of each of 
those numbers that are less than the maximum number.
For this case the list will contain a maximum of 3 numbers 
that are all relatively prime to each
other.

这是我的代码:

def countMultiples(l, max_num):
    counting_list = []
    for i in l:
        for j in range(1, max_num):
            if (i * j < max_num) and (i * j) not in counting_list:
                counting_list.append(i * j)
    return len(counting_list)

虽然我的算法可以正常工作,但是当最大数量太大时会卡住

>>> countMultiples([3],30)
9      #WORKS GOOD

>>> countMultiples([3,5],100)
46     #WORKS GOOD

>>> countMultiples([13,25],100250)
Line 5: TimeLimitError: Program exceeded run time limit. 

如何优化此代码?

3和5具有相同的倍数,例如15。

您应该删除这些倍数,您会得到正确的答案

另外,您还应该检查包含排除原则https://en.wikipedia.org/wiki/Inclusion-exclusion_principle#Counting_integers

编辑:问题可以在固定时间内解决。 正如之前所链接的那样,解决方案是包含在-排除原则中。

假设您想获得小于100的3的倍数,可以通过将floor(100/3)除以进行此操作,对5,floor(100/5)也是如此。 现在,要获得小于100的3和5的乘积,您必须将它们相加,然后减去两者的倍数。 在这种情况下,减去15的倍数。因此3和5的倍数小于100的答案是floor(100/3)+ floor(100/5)-floor(100/15)。 如果您有2个以上的数字,则它会变得有些复杂,但是采用相同的方法进行更多检查https://en.wikipedia.org/wiki/Inclusion-exclusion_principle#Counting_integers

EDIT2:

同样,可以加快循环速度。 您当前的算法会在列表中追加多个,这非常慢。 您应该切换内部和外部for循环。 这样做,您将检查是否有任何除数将数字除,然后得到除数。

因此,只需添加一个布尔变量,该变量将告诉您除数是否除以数字,并计算该变量为真的次数。

因此它是这样的:

def countMultiples(l, max_num):
  nums = 0
  for j in range(1, max_num):
    isMultiple = False
    for i in l:  
      if (j % i == 0):
    isMultiple = True
    if (isMultiple == True):
      nums += 1
  return nums

print countMultiples([13,25],100250)

如果列表的长度是您所需要的,那么最好还是进行提示而不是创建另一个列表。

def countMultiples(l, max_num):
    count = 0
    counting_list = []
    for i in l:
        for j in range(1, max_num):
            if (i * j < max_num) and (i * j) not in counting_list:
                count += 1
    return count

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM