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.