Come controlli se un numero è divisibile per un altro numero (Python)?


112

Devo verificare se ogni numero da 1 a 1000 è un multiplo di 3 o un multiplo di 5. Il modo in cui pensavo di farlo sarebbe dividere il numero per 3 e se il risultato è un numero intero allora lo farebbe essere un multiplo di 3. Uguale a 5.

Come posso verificare se il numero è un numero intero?

ecco il mio codice attuale:

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

2
In Python 2.x, la divisione di interi produce sempre un numero intero.
Russell Borogove

14
Dovresti stampare "Fizz" e "Buzz"
wim

9
Progetto Eulero Problema 1?
Ashutosh Dave

Risposte:


228

Puoi farlo usando l'operatore modulo, %

n % k == 0

restituisce vero se e solo se nè un multiplo esatto di k. In matematica elementare questo è noto come il resto di una divisione.

Nel tuo approccio attuale esegui una divisione e il risultato sarà uno dei due

  • sempre un numero intero se usi la divisione intera, o
  • sempre un float se usi la divisione in virgola mobile.

È solo il modo sbagliato di testare la divisibilità.


0% 5 == 0 sarebbe anche vero, ma zero non è un multiplo esatto di zero.
Fusion

@Fusion0 == 0*5
David Heffernan

@Chris_Rands Mettilo in una risposta, le persone che praticano il golf in codice (come me) sarebbero molto felici. In effetti, sono venuto qui in cerca di una risposta da golf del genere.
MilkyWay90

5

Puoi semplicemente usare l' %operatore Modulo per controllare la divisibilità.
Ad esempio: n % 2 == 0significa che n è esattamente divisibile per 2 e n % 2 != 0significa che n non è esattamente divisibile per 2.


1

Ho avuto lo stesso approccio. Perché non ho capito come utilizzare l'operatore module (%).

6% 3 = 0 * Ciò significa che se dividi 6 per 3 non avrai un resto, 3 è un fattore di 6.

Ora devi metterlo in relazione con il tuo problema dato.

se n% 3 == 0 * Questo sta dicendo, se il mio numero (n) è divisibile per 3 lasciando uno 0 resto.

Aggiungi la tua dichiarazione then (stampa, restituzione) e continua con


0

Puoi usare l' operatore% per controllare la divisibilità di un dato numero

Il codice per verificare se dato no. è divisibile per 3 o 5 quando n. meno di 1000 è dato di seguito:

n=0
while n<1000:
    if n%3==0 or n%5==0:
        print n,'is multiple of 3 or 5'
    n=n+1

0

Questo codice sembra fare quello che stai chiedendo.

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

O qualcosa di simile

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

O qualsiasi numero di cose.


per rispondere alla tua domanda: seleziona e ctrl + K rientri. L'ho fatto per te per questa volta.
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!")

1
È meglio spiegare la correzione che hai dato e cosa ha funzionato
chans

1
Questo NON è un buon modo per testare la divisibilità: eseguire una divisione in virgola mobile, convertire in una stringa e quindi manipolare le stringhe per scoprire se la parte frazionaria è (letteralmente) ".0" è per lo meno inefficiente e forse sbagliato a seconda l'implementazione in virgola mobile e il codice che esegue le conversioni.
NickD

Ad esempio, prova x=10000000000000000; b = str(x/(x-1)); bnell'interprete Python.
NickD

-2

Per piccoli numeri n%3 == 0andrà bene. Per numeri molto grandi propongo di calcolare prima la somma incrociata e poi verificare se la somma incrociata è un multiplo di 3:

def is_divisible_by_3(number):
    if sum(map(int, str(number))) % 3 != 0:
        my_bool = False
    return my_bool

2
Il calcolo della somma incrociata e l'utilizzo dell'operazione modulo è davvero più veloce rispetto all'utilizzo diretto dell'operazione modulo? Se è così, non dovresti chiamare la tua funzione in modo ricorsivo fino a quando il numero è "abbastanza piccolo"?
suona il clacson il

-6

Prova questo ...

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);    
  }
}

Dubito che Java sia Python, quindi questa non è una risposta valida
MilkyWay90

La tua risposta non è pertinente alla domanda
Varadaraju G

-6

jinja2 modello 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>

5
È stata richiesta una soluzione in Python.
jmd_dk

1
La tua risposta non è pertinente alla domanda
Varadaraju G

-7

Il modo più semplice è verificare se un numero è un numero intero int(x) == x. Altrimenti, quello che ha detto David Heffernan.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.