SORU
8 EKİM 2009, PERŞEMBE


C - eğer bir sayının asal sayı olup olmadığını belirlemek

Deniyorum ama bir yöntemi alır bir tamsayı döndürür bir boolean ki: eğer sayı asal veya değil ve fazla bir şey bilmiyorum C; kimse bakımı için bana biraz tavsiye?

Temelde, C ben böyle yapardım# bu gibi:

static bool IsPrime(int number)
{
    for (int i = 2; i < number; i  )
    {
        if (number % i == 0 && i != number)
            return false;
    }
    return true;
}

CEVAP
8 EKİM 2009, PERŞEMBE


TAMAM, bu yüzden size bir numara vereyim Varsayalım C. unutun ve eğer asal olup olmadığını belirlemek için isteyin. Bunu nasıl yapıyorsun? Adımları açıkça yazınsonrakod çeviriyor dert.

Algoritma tespit ettik sonra, başkalarına yardım etmek için bir program yazmak için nasıl anlamaya için çok daha kolay olacak.

düzenleme:İşte C# ilan kodu:

static bool IsPrime(int number) {
    for (int i = 2; i < number; i  ) {
        if (number % i == 0 && i != number) return false;
    }
    return true;
}

Buçok neredeysegeçerli C; Yok bool tip C ve true false, böylece ihtiyacınız için değiştirmek biraz (edit: Christopher Johnson doğru çekiyor C99 ekledi stdbool.h) başlık. Ayrıca, C99, deyimi değişken bir ilan edemezsin, ve derleyici bir sürü hala varsayılan olarak desteklemez önce, o da değiştirelim:

int IsPrime(int number) {
    int i;
    for (i=2; i<number; i  ) {
        if (number % i == 0 && i != number) return 0;
    }
    return 1;
}

Bu senden ne istiyor bu son derece geçerli bir C programıdır. Çok fazla çaba olmadan biraz daha geliştirebiliriz. İlk, i number i != number her zaman başarılı olur bu onay her zaman daha az olduğunu unutmayın; biz de kurtulalım.

Ayrıca, ta number - 1; Karekök(sayı) ulaştığınızda kontrol durdurmak için bölenlerine kadar denemeye gerek yok. sqrt kayan nokta işlemi ve inceliklerini koca bir servet getiren bu yana, aslında sqrt(number) bilgi işlem yapmayacağız. Bunun yerine, sadece i*i <= number bunu kontrol edebiliriz:

int IsPrime(int number) {
    int i;
    for (i=2; i*i<=number; i  ) {
        if (number % i == 0) return 0;
    }
    return 1;
}

Son bir şey; özgün algoritma küçük bir hata vardı! Eğer number negatif veya sıfır veya, eğer varsa, bu işlev, sayının asal sayı olduğunu iddia edecektir. Büyük olasılıkla bu doğru olarak işlemek istiyorum, ve pozitif değerler sadece: hakkında bakım için daha olasıdır beri number imzasız olması yapmak isteyebilirsiniz

int IsPrime(unsigned int number) {
    if (number <= 1) return 0; // zero and one are not prime
    unsigned int i;
    for (i=2; i*i<=number; i  ) {
        if (number % i == 0) return 0;
    }
    return 1;
}

Bu kesinlikle bir asal sayı, ama çalışıp çalışmadığını kontrol etmek için en hızlı yol değildir, ve oldukça basittir. Biz zar zor kodunuzu değiştirmek oldu!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChannelRichard

    ChannelRicha

    7 Kasım 2008
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • Michael Lummio

    Michael Lumm

    25 Mayıs 2007