Как найти кратные числа в диапазоне без цикла?

#python #python-3.x

Вопрос:

 a=10,b=20,c=3
 

например,мне нужна программа,чтобы найти, сколько кратных у c=3, которые находятся между a, b или b, a?
как сделать эту программу без использования цикла? в этом примере с этим вводом программа должна выдать нам вывод 3, потому что кратные 3 равны 12,15,18, а эти числа находятся между 10,20, поэтому 3 будет правильным.

Комментарии:

1. Пожалуйста, покажите свои собственные усилия и что в этом плохого. Что значит «между»? Являются ли границы всеобъемлющими или исключительными?

2. Вероятно, это можно было бы сделать без циклов, если бы вы его жестко закодировали. Но почему? Для этого вам понадобится как минимум 1 или 2 петли

3. Ты действительно хочешь учиться?

Ответ №1:

Вы можете взять частное от обоих чисел, разделенное на c, а затем вычесть их, чтобы получить число, кратное между ними

 
a=100
b=200
c=3

multiple1 = a//c
multiple2 = b//c

print(multiple2-multiple1)

# this is not required, just for confirming that above logic works
count = 0
for i in range(a,b):
    if(i%c == 0):
        count =1
print(count)


 

оба результата равны 33

Комментарии:

1. при таком решении верхняя граница исключается, а нижняя граница включается

2. я пробовал, это хорошо работает для 10,20,3,но когда я попробовал a,b, c=10,20,5, вместо вывода 3 это дает 2

3. Но между 10 и 20 у нас есть только 15 и 20, верно? Вы также хотели бы включить 10. Может быть, это то, что прокомментировал @mozway

4. мне нравится этот ответ, он такой умный, поскольку основан на чистой математической логике, такой чертовски умный.

Ответ №2:

используйте range , начиная с ближайшего верхнего (или равного) делителя:

 import math
len(range(math.ceil(a/c)*c, b, c)) # if the upper bound is inclusive, use b 1
 

вывод: 3 для a=10;b=20;c=3

nb. вы также можете напрямую получить номер, используя (b-math.ceil(a/c)*c)//c 1 (включая обе границы)

ПРИМЕЧАНИЕ. если вы не хотите использовать math модуль: (b (-a//c)*c)//c 1

Ответ №3:

Я написал код ниже:

 def count_multiples(a, b, c):
    count = 1 if min(a, b)%c == 0 else 0
    count  = abs(a//c - b//c)
    return count

print(count_multiples(30, 15, 2))
 

При этом учитываются как нижняя, так и верхняя границы.

Я протестировал его для ограниченного числа тестов, но он должен работать для любой комбинации чисел. Вы можете попробовать это и дать мне знать, если это сработает.

Ответ №4:

Для этого вам понадобится пакет «numpy». Если вы еще не установили его, откройте свой терминал и запустите «conda install numpy» или «pip install numpy».

Код:

 Import numpy as np 

a=10
b=20
c=3

x=np.arange(a,b,1) #it will create a list with integers [10,11,...,18,19]
                   # if you want to include/exclude 10,20 do  /- 1

count_multiples = list(map(lambda y: y %c, x)).count(0)
                 
                # y %c, will give the modulo. The modulo will be 0, if the integer is a multiple of c
                # .count(0), will count how many modulos are zero
                # with lambda you create a function, in this case y %c
                # map can be used instead of a loop and will check every element  of the list 
 

Ответ №5:

 a,b,c=10,20,5

def countmultiples(a,b,c):
    start = a-a%c

    multiples = list(range(start,b 1,c))
    sumofmultiples = len(multiples)

    if multiples[0]%c!=0 or multiples[0]<a:
        sumofmultiples-=1
        multiples.pop(0)

    return multiples,sumofmultiples

print(countmultiples(a,b,c)
 

поэтому мне нужно было найти кратные между a и b, также включенные в оба. таким образом,он идеально работает для каждого числа без циклов, рекурсивных и встроенных функций.