¿Cómo se comprueba si un número es divisible por otro número (Python)?

112

Necesito probar si cada número del 1 al 1000 es un múltiplo de 3 o un múltiplo de 5. La forma en que pensé que haría esto sería dividir el número por 3, y si el resultado es un número entero, entonces lo haría ser un múltiplo de 3. Lo mismo con 5.

¿Cómo pruebo si el número es un entero?

Aquí está mi código actual:

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
fuente
2
En Python 2.x, la división de enteros siempre produce un entero.
Russell Borogove
14
Debería imprimir "Fizz" y "Buzz"
wim
9
Proyecto Euler Problema 1?
Ashutosh Dave

Respuestas:

228

Haces esto usando el operador de módulo, %

n % k == 0

evalúa verdadero si y solo si nes un múltiplo exacto de k. En matemáticas de primaria, esto se conoce como el resto de una división.

En su enfoque actual, realiza una división y el resultado será

  • siempre un número entero si usa la división entera, o
  • siempre un flotante si usa la división de punto flotante.

Es simplemente la forma incorrecta de probar la divisibilidad.

David Heffernan
fuente
0% 5 == 0 también sería verdadero, pero cero no es múltiplo exacto de cero.
Fusion
@Fusion0 == 0*5
David Heffernan
@Chris_Rands Pon eso en una respuesta, la gente que practica golf en código (como yo) estaría muy feliz. De hecho, vine aquí buscando una respuesta de golf como esa.
MilkyWay90
5

Simplemente puede usar el %operador de módulo para verificar la divisibilidad.
Por ejemplo: n % 2 == 0significa que n es exactamente divisible por 2 y n % 2 != 0significa que n no es exactamente divisible por 2.

Pankaj Prakash
fuente
1

Tuve el mismo enfoque. Porque no entendí cómo usar el operador del módulo (%).

6% 3 = 0 * Esto significa que si divide 6 entre 3 no tendrá resto, 3 es un factor de 6.

Ahora tienes que relacionarlo con tu problema dado.

if n% 3 == 0 * Esto está diciendo, si mi número (n) es divisible por 3 dejando un resto 0.

Agregue su declaración de entonces (imprimir, devolver) y continúe su

brandon gossman
fuente
0

Puede usar el operador% para verificar la divisibilidad de un número dado

El código para comprobar si se dio no. es divisible por 3 o 5 cuando no. A continuación se da menos de 1000:

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
fuente
0

Este código parece hacer lo que está pidiendo.

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

O algo como

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

O cualquier cantidad de cosas.

Bufón de Bennett
fuente
para responder a su pregunta: seleccione y ctrl + K sangrías. Lo he hecho por ti esta vez.
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
fuente
1
Es mejor explicar la solución que le ha dado y qué hizo que funcionara
chans
1
Esa NO es una buena manera de probar la divisibilidad: hacer una división flotante, convertir a una cadena y luego hacer manipulaciones de cadena para encontrar si la parte fraccionaria es (literalmente) ".0" es al menos ineficiente y posiblemente incorrecta dependiendo de la implementación de punto flotante y el código que hace las conversiones.
NickD
Por ejemplo, intente x=10000000000000000; b = str(x/(x-1)); ben el intérprete de Python.
NickD
-2

Para números pequeños n%3 == 0estará bien. Para números muy grandes, propongo calcular primero la suma cruzada y luego verificar si la suma cruzada es un múltiplo de 3:

def is_divisible_by_3(number):
    if sum(map(int, str(number))) % 3 != 0:
        my_bool = False
    return my_bool
nurlan.turganaliev
fuente
2
¿Calcular la suma cruzada y usar la operación de módulo es realmente más rápido que usar directamente la operación de módulo? Si es así, ¿no debería llamar a su función de forma recursiva hasta que el número sea lo suficientemente "pequeño"?
bocinazo el
-6

Prueba esto ...

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
fuente
Dudo que Java sea Python, por lo que esta no es una respuesta válida
MilkyWay90
Su respuesta no es relevante para la pregunta
Varadaraju G
-6

plantilla 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
fuente
5
Se solicitó una solución en Python.
jmd_dk
1
Su respuesta no es relevante para la pregunta
Varadaraju G
-7

La forma más sencilla es comprobar si un número es un número entero int(x) == x. De lo contrario, lo que dijo David Heffernan.

cschorn
fuente