Bagaimana Anda memeriksa apakah suatu nomor habis dibagi oleh nomor lain (Python)?


112

Saya perlu menguji apakah setiap angka dari 1 hingga 1000 adalah kelipatan 3 atau kelipatan 5. Cara yang saya pikir akan saya lakukan ini adalah dengan membagi angka dengan 3, dan jika hasilnya adalah bilangan bulat maka itu akan terjadi. menjadi kelipatan 3. Sama dengan 5.

Bagaimana cara menguji apakah nomor tersebut adalah bilangan bulat?

ini kode saya saat ini:

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
Dalam Python 2.x, pembagian integer selalu menghasilkan integer.
Russell Borogove

14
Anda harus mencetak "Fizz" dan "Buzz"
wim

9
Proyek Euler Masalah 1?
Ashutosh Dave

Jawaban:


228

Anda melakukan ini menggunakan operator modulus, %

n % k == 0

mengevaluasi benar jika dan hanya jika nmerupakan kelipatan tepat dari k. Dalam matematika dasar, ini dikenal sebagai sisa dari sebuah pembagian.

Dalam pendekatan Anda saat ini, Anda melakukan pembagian dan hasilnya akan baik

  • selalu berupa integer jika Anda menggunakan pembagian integer, atau
  • selalu float jika Anda menggunakan pembagian floating point.

Itu hanya cara yang salah untuk menguji keterpisahan.


0% 5 == 0 akan menjadi True juga, tetapi nol bukanlah kelipatan tepat dari nol.
Fusion

@Fusion0 == 0*5
David

@Chris_Rands Jawabannya adalah, orang yang melakukan code-golf (seperti saya) akan sangat senang. Sebenarnya, saya datang ke sini mencari jawaban golf seperti itu.
MilkyWay90

5

Anda cukup menggunakan %operator Modulus untuk memeriksa pembagian.
Sebagai contoh: n % 2 == 0berarti n habis habis dibagi 2 dan n % 2 != 0berarti n tidak habis habis dibagi 2.


1

Saya memiliki pendekatan yang sama. Karena saya tidak mengerti cara menggunakan operator module (%).

6% 3 = 0 * Ini berarti jika Anda membagi 6 dengan 3 Anda tidak akan memiliki sisa, 3 adalah faktor dari 6.

Sekarang Anda harus menghubungkannya dengan masalah Anda.

if n% 3 == 0 * Ini mengatakan, jika bilangan saya (n) habis dibagi 3 meninggalkan sisa 0.

Tambahkan pernyataan kemudian (cetak, kembalikan) dan lanjutkan


0

Anda dapat menggunakan % operator untuk memeriksa pembagian nomor tertentu

Kode untuk mengecek apakah diberikan no. habis dibagi 3 atau 5 jika tidak. kurang dari 1000 diberikan di bawah ini:

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

Kode ini tampaknya melakukan apa yang Anda minta.

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

Atau semacamnya

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

Atau beberapa hal.


untuk menjawab pertanyaan Anda: pilih dan ctrl + K indentasi. Saya telah melakukan itu untuk Anda kali ini.
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
Lebih baik menjelaskan perbaikan yang telah Anda berikan dan apa yang membuatnya berhasil
chans

1
Itu BUKAN cara yang baik untuk menguji dapat dibagi: melakukan pembagian float, mengonversi menjadi string dan kemudian melakukan manipulasi string untuk menemukan apakah bagian pecahan (secara harfiah) ".0" paling tidak tidak efisien, dan mungkin salah tergantung pada implementasi floating point dan kode yang melakukan konversi.
NickD

Misal coba x=10000000000000000; b = str(x/(x-1)); bdi interpreter python.
NickD

-2

Untuk jumlah kecil n%3 == 0akan baik-baik saja. Untuk bilangan yang sangat besar saya mengusulkan untuk menghitung jumlah silang terlebih dahulu dan kemudian memeriksa apakah jumlah silang tersebut adalah kelipatan 3:

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

2
Apakah menghitung jumlah silang dan menggunakan operasi modulus benar-benar lebih cepat daripada langsung menggunakan operasi modulus? Jika demikian, bukankah sebaiknya Anda memanggil fungsi Anda secara rekursif sampai jumlahnya cukup "kecil"?
membunyikan klakson

-6

Coba ini ...

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

Saya ragu Java adalah Python, jadi ini bukan jawaban yang valid
MilkyWay90

Jawaban Anda tidak relevan dengan pertanyaan
Varadaraju G

-6

jinja2 template 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
Solusi dengan Python diminta.
jmd_dk

1
Jawaban Anda tidak relevan dengan pertanyaan
Varadaraju G

-8

Cara paling sederhana adalah dengan menguji apakah suatu bilangan adalah bilangan bulat int(x) == x. Sebaliknya, apa yang dikatakan David Heffernan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.