Como você verifica se um número é divisível por outro número (Python)?


112

Preciso testar se cada número de 1 a 1000 é um múltiplo de 3 ou um múltiplo de 5. A maneira como pensei que faria isso seria dividir o número por 3 e, se o resultado for um inteiro, então seja um múltiplo de 3. Mesmo com 5.

Como faço para testar se o número é um inteiro?

Aqui está meu código atual:

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
No Python 2.x, a divisão de inteiros sempre resulta em um inteiro.
— Russell Borogove

14
Você deve imprimir "Fizz" e "Buzz"
— wim

9
Problema 1 do Projeto Euler?
— Ashutosh Dave

Respostas:


228

Você faz isso usando o operador de módulo, %

n % k == 0

avalia verdadeiro se e somente se nfor um múltiplo exato de k. Em matemática elementar, isso é conhecido como o resto de uma divisão.

Em sua abordagem atual, você realiza uma divisão e o resultado será

  • sempre um número inteiro se você usar divisão de número inteiro, ou
  • sempre um float se você usar a divisão de ponto flutuante.

É a maneira errada de testar a divisibilidade.


0% 5 == 0 também seria verdadeiro, mas zero não é múltiplo exato de zero.
— Fusion de

@Fusion0 == 0*5
— David Heffernan

@Chris_Rands Coloque isso em uma resposta, as pessoas que jogam golfe de código (como eu) ficariam muito felizes. Na verdade, vim aqui em busca de uma resposta prática como essa.
— MilkyWay90

5

Você pode simplesmente usar o %operador Modulus para verificar a divisibilidade.
Por exemplo: n % 2 == 0significa n é exatamente divisível por 2 e n % 2 != 0significa n não é exatamente divisível por 2.


1

Eu tive a mesma abordagem. Porque eu não entendi como usar o operador de módulo (%).

6% 3 = 0 * Isso significa que se você dividir 6 por 3, não terá um resto, 3 é um fator de 6.

Agora você deve relacioná-lo ao seu problema.

if n% 3 == 0 * Isso quer dizer, se meu número (n) é divisível por 3 deixando um 0 resto.

Adicione sua declaração de então (imprimir, retornar) e continue seu


0

Você pode usar o operador% para verificar a divisibilidade de um determinado número

O código para verificar se dado não. é divisível por 3 ou 5 quando não. menos de 1000 é dado abaixo:

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

Este código parece fazer o que você está pedindo.

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

Ou algo como

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

Ou qualquer outra coisa.


para responder à sua pergunta: selecione e ctrl + K indentações. Eu fiz isso por você neste momento.
— 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
É melhor explicar a correção que você deu e o que a fez funcionar
— canções de

1
Essa NÃO é uma boa maneira de testar a divisibilidade: fazendo uma divisão flutuante, convertendo em uma string e, em seguida, fazendo manipulações de string para descobrir se a parte fracionária é (literalmente) ".0" é no mínimo ineficiente e possivelmente errada, dependendo de a implementação de ponto flutuante e o código que faz as conversões.
— NickD

Por exemplo, tente x=10000000000000000; b = str(x/(x-1)); bno interpretador python.
— NickD

-2

Para números pequenos n%3 == 0, tudo bem. Para números muito grandes, proponho calcular primeiro a soma cruzada e depois verificar se a soma cruzada é um múltiplo de 3:

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

2
Calcular a soma cruzada e usar a operação de módulo é realmente mais rápido do que usar diretamente a operação de módulo? Em caso afirmativo, você não deveria chamar sua função recursivamente até que o número seja "pequeno" o suficiente?
— buzina de

-6

Experimente isso ...

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

Duvido que Java seja Python, então esta não é uma resposta válida
— MilkyWay90

Sua resposta não é relevante para a pergunta
— Varadaraju G

-6

modelo 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>

5
Foi solicitada uma solução em Python.
— jmd_dk

1
Sua resposta não é relevante para a pergunta
— Varadaraju G

-7

A maneira mais simples é testar se um número é um inteiro int(x) == x. Caso contrário, o que David Heffernan disse.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.