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
Taimur
fonte
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.

David Heffernan
fonte
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.

Pankaj Prakash
fonte
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

Brandon Gossman
fonte
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
Lordferrous
fonte
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.

Bennett Jester
fonte
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!")
James Faber
fonte
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
nurlan.turganaliev
fonte
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);    
  }
}
Asanka Dhananjaya
fonte
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>
Richard Morgan
fonte
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.

Cschorn
fonte