Comment vérifier si un nombre est divisible par un autre nombre (Python)?


112

J'ai besoin de tester si chaque nombre de 1 à 1000 est un multiple de 3 ou un multiple de 5. La façon dont je pensais faire cela serait de diviser le nombre par 3, et si le résultat est un entier, il le ferait être un multiple de 3. Idem avec 5.

Comment tester si le nombre est un entier?

Voici mon code actuel:

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
Dans Python 2.x, la division entière produit toujours un entier.
Russell Borogove

14
Vous devriez imprimer "Fizz" et "Buzz"
wim

9
Projet Euler Problème 1?
Ashutosh Dave

Réponses:


228

Vous faites cela en utilisant l'opérateur de module, %

n % k == 0

évalue true si et seulement si nest un multiple exact de k. En mathématiques élémentaires, cela s'appelle le reste d'une division.

Dans votre approche actuelle, vous effectuez une division et le résultat sera soit

  • toujours un entier si vous utilisez la division entière, ou
  • toujours un flottant si vous utilisez la division en virgule flottante.

C'est juste la mauvaise façon de tester la divisibilité.


0% 5 == 0 serait également vrai, mais zéro n'est pas un multiple exact de zéro.
Fusion

@Fusion0 == 0*5
David Heffernan

@Chris_Rands Mettez cela dans une réponse, les gens qui font du code-golf (comme moi) seraient très heureux. En fait, je suis venu ici à la recherche d'une réponse golfique comme celle-là.
MilkyWay90

5

Vous pouvez simplement utiliser l' %opérateur Modulus pour vérifier la divisibilité.
Par exemple: n % 2 == 0signifie que n est exactement divisible par 2 et n % 2 != 0signifie que n n'est pas exactement divisible par 2.


1

J'ai eu la même approche. Parce que je n'ai pas compris comment utiliser l'opérateur module (%).

6% 3 = 0 * Cela signifie que si vous divisez 6 par 3 vous n'aurez pas de reste, 3 est un facteur de 6.

Maintenant, vous devez le relier à votre problème donné.

si n% 3 == 0 * Cela veut dire, si mon nombre (n) est divisible par 3 laissant un reste 0.

Ajoutez ensuite votre relevé (impression, retour) et continuez votre


0

Vous pouvez utiliser l' opérateur% pour vérifier la divisiblité d'un nombre donné

Le code pour vérifier si donné non. est divisible par 3 ou 5 quand non. moins de 1000 est indiqué ci-dessous:

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

Ce code semble faire ce que vous demandez.

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

Ou quelque chose comme

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

Ou un certain nombre de choses.


pour répondre à votre question: sélectionnez et ctrl + K retraits. Je l'ai fait pour vous pour cette fois.
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
Il vaut mieux expliquer le correctif que vous avez donné et ce qui l'a fait fonctionner
chans

1
Ce n'est PAS un bon moyen de tester la divisibilité: faire une division flottante, convertir en une chaîne et ensuite faire des manipulations de chaîne pour trouver si la partie fractionnaire est (littéralement) ".0" est à tout le moins inefficace, et peut-être faux selon l'implémentation en virgule flottante et le code qui effectue les conversions.
NickD

Par exemple, essayez x=10000000000000000; b = str(x/(x-1)); bdans l'interpréteur python.
NickD

-2

Pour les petits nombres, tout n%3 == 0ira bien. Pour les très grands nombres, je propose de calculer d'abord la somme croisée, puis de vérifier si la somme croisée est un multiple de 3:

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

2
Le calcul de la somme croisée et l'utilisation de l'opération de module sont-ils vraiment plus rapides que l'utilisation directe de l'opération de module? Si oui, ne devriez-vous pas appeler votre fonction de manière récursive jusqu'à ce que le nombre soit suffisamment "petit"?
klaxonner

-6

Essaye ça ...

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

Je doute que Java soit Python, donc ce n'est pas une réponse valide
MilkyWay90

Votre réponse n'est pas pertinente par rapport à la question
Varadaraju G

-6

jinja2 modèle 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
Une solution en Python a été demandée.
jmd_dk

1
Votre réponse n'est pas pertinente par rapport à la question
Varadaraju G

-8

Le moyen le plus simple est de tester si un nombre est un entier int(x) == x. Sinon, ce que David Heffernan a dit.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.