Jak sprawdzić, czy liczba jest podzielna przez inną liczbę (Python)?

112

Muszę sprawdzić, czy każda liczba od 1 do 1000 jest wielokrotnością 3 lub wielokrotnością 5. Pomyślałem, że zrobię to, aby podzielić liczbę przez 3, a jeśli wynik jest liczbą całkowitą, być wielokrotnością 3. To samo z 5.

Jak sprawdzić, czy liczba jest liczbą całkowitą?

oto mój obecny kod:

n = 0
s = 0

while (n < 1001):
    x = n/3
    if isinstance(x, (int, long)):
        print 'Multiple of 3!'
        s = s + n
    if False:
        y = n/5
        if isinstance(y, (int, long)):
            s = s + n

    print 'Number: '
    print n
    print 'Sum:'
    print s
    n = n + 1
Taimur
źródło
2
W Pythonie 2.x dzielenie liczb całkowitych zawsze daje liczbę całkowitą.
Russell Borogove
14
Powinieneś drukować „Fizz” i „Buzz”
wim
9
Projekt Euler Problem 1?
Ashutosh Dave

Odpowiedzi:

228

Robisz to za pomocą operatora modułu, %

n % k == 0

oblicza prawdę wtedy i tylko wtedy, gdy njest dokładną wielokrotnością k. W matematyce elementarnej jest to znane jako reszta z dzielenia.

W Twoim obecnym podejściu dokonujesz podziału i wynik będzie albo

  • zawsze jest liczbą całkowitą, jeśli używasz dzielenia liczb całkowitych, lub
  • zawsze wartość zmiennoprzecinkowa, jeśli używasz dzielenia zmiennoprzecinkowego.

To po prostu zły sposób testowania podzielności.

David Heffernan
źródło
0% 5 == 0 również byłoby Prawdą, ale zero nie jest dokładną wielokrotnością zera.
Fusion
@ Fusion0 == 0*5
David Heffernan
@Chris_Rands Odpowiadając, ludzie uprawiający code-golf (jak ja) byliby bardzo szczęśliwi. Prawdę mówiąc, przyszedłem tutaj, szukając odpowiedzi w golfa.
MilkyWay90
5

Możesz po prostu użyć %operatora Modulus, aby sprawdzić podzielność.
Na przykład: n % 2 == 0oznacza, że ​​n jest dokładnie podzielne przez 2 i n % 2 != 0oznacza, że ​​n nie jest dokładnie podzielne przez 2.

Pankaj Prakash
źródło
1

Miałem takie samo podejście. Ponieważ nie rozumiem, jak używać operatora modułu (%).

6% 3 = 0 * Oznacza to, że jeśli podzielisz 6 przez 3, nie będziesz miał reszty, 3 to współczynnik 6.

Teraz musisz odnieść to do danego problemu.

if n% 3 == 0 * To znaczy, że jeśli moja liczba (n) jest podzielna przez 3, pozostawiając 0 resztę.

Dodaj swoje oświadczenie (wydrukuj, zwróć) i kontynuuj

Brandon Gossman
źródło
0

Możesz użyć operatora%, aby sprawdzić podzielność podanej liczby

Kod do sprawdzenia, czy podano nr. jest podzielna przez 3 lub 5, gdy nie. mniej niż 1000 podano poniżej:

n=0
while n<1000:
    if n%3==0 or n%5==0:
        print n,'is multiple of 3 or 5'
    n=n+1
Lordferrous
źródło
0

Ten kod wydaje się robić to, o co prosisz.

for value in range(1,1000):
    if value % 3 == 0 or value % 5 == 0:
        print(value)

Albo coś w stylu

for value in range(1,1000):
    if value % 3 == 0 or value % 5 == 0:
        some_list.append(value)

Lub wiele rzeczy.

Bennett Jester
źródło
aby odpowiedzieć na twoje pytanie: zaznacz i ctrl + K. wcięcia. Zrobiłem to dla ciebie tym razem.
Jean-François Fabre
-1
a = 1400
a1 = 5
a2 = 3

b= str(a/a1)
b1 = str(a/a2)
c =b[(len(b)-2):len(b)]
c1 =b[(len(b1)-2):len(b1)]
if c == ".0":
    print("yeah for 5!")
if c1 == ".0":
    print("yeah for 3!")
James Faber
źródło
1
Lepiej wyjaśnić poprawkę, którą podałeś i co sprawiło, że zadziałało
chans
1
To NIE jest dobry sposób testowania podzielności: dzielenie typu float, konwersja na łańcuch, a następnie wykonywanie operacji na łańcuchach w celu ustalenia, czy część ułamkowa to (dosłownie) „.0” jest co najmniej nieefektywne i prawdopodobnie błędne w zależności od implementacja zmiennoprzecinkowa i kod, który dokonuje konwersji.
NickD
Np spróbować x=10000000000000000; b = str(x/(x-1)); bw interpreter Pythona.
NickD
-2

Dla małych liczb n%3 == 0będzie dobrze. W przypadku bardzo dużych liczb proponuję najpierw obliczyć sumę krzyżową, a następnie sprawdzić, czy suma krzyżowa jest wielokrotnością 3:

def is_divisible_by_3(number):
    if sum(map(int, str(number))) % 3 != 0:
        my_bool = False
    return my_bool
nurlan.turganaliev
źródło
2
Czy obliczanie sumy krzyżowej i używanie operacji modułu jest naprawdę szybsze niż bezpośrednio przy użyciu operacji modułu? Jeśli tak, czy nie powinieneś wywoływać swojej funkcji rekurencyjnie, dopóki liczba nie będzie wystarczająco „mała”?
trąbić
-6

Spróbuj tego ...

public class Solution {

  public static void main(String[] args) {
    long t = 1000;
    long sum = 0;

    for(int i = 1; i<t; i++){
            if(i%3 == 0 || i%5 == 0){
                sum = sum + i;
            }
        }
        System.out.println(sum);    
  }
}
Asanka Dhananjaya
źródło
Wątpię, czy Java to Python, więc to nie jest prawidłowa odpowiedź
MilkyWay90
Twoja odpowiedź nie dotyczy pytania
Varadaraju G,
-6

szablon jinja2 fizzbuz:

<form>
  <ol>
    {% for x in range(1,n+1) %}
      {% set fizzbuzz_rpm = x %}
      {% if x % 3 == 0 and x % 5 == 0 %}
        {% set fizzbuzz_rpm="FizzBuzz" %}
      {% elif x % 3 == 0 %}
          {% set fizzbuzz_rpm="Fizz" %}
      {% elif x %5 == 0 %}
          {% set fizzbuzz_rpm="Buzz" %}
      {% endif %}
      <li>{{fizzbuzz_rpm}}</li>
    {% endfor %}
  </ol>
</form>
Richard Morgan
źródło
5
Poproszono o rozwiązanie w Pythonie.
jmd_dk,
1
Twoja odpowiedź nie dotyczy pytania
Varadaraju G,
-8

Najprostszym sposobem jest sprawdzenie, czy liczba jest liczbą całkowitą int(x) == x. W przeciwnym razie, co powiedział David Heffernan.

cschorn
źródło