2016-03-21 23 views
0

Bazı sebeplerden dolayı doğru cevabı vermez ve bazı sebeplerden dolayı daha küçük girdilerle doğru olanı verir.Euler'ın problem10 kodunun nesi var?

public class Problem10 { 
    public static void main(String[] args) { 
     System.out.println(sumPrimeNumber(2000000)); 
    } 
    public static boolean isPrime(int prime){ 
     boolean isPrime = true; 
     if(prime%2==0) 
      return false; 
     for(int i = 3;i<=Math.pow(prime, 0.5);i+=2){ 
      if(prime%i==0){ 
       return false; 
      } 
     } 
     return isPrime; 
    } 
    public static int sumPrimeNumber(int max){ 
     int sum = 0; 
     int prime = 3; 
     while(prime < max){ 
      if(isPrime(prime)){ 
       sum += prime; 
      } 
      prime += 2; 
     } 
     return sum + 2; 
    } 
} 
+0

Daha büyük sayılarla uğraştığınız için INT'den biraz daha yüksek bir veri türü kullanmalısınız ... –

cevap

0

Toplamı değiştirmem gerektiğini düşünüyorum. Ben buna rağmen taşma yapmadı çünkü pozitif bir tam sayı veriyor.

0

Int (maks 2 milyar) muhtemelen taşıyor olabilir. Invertörleri uzunluğa değiştirin.

public class Problem10 { 
    public static void main(String[] args) { 
     System.out.println(sumPrimeNumber(2000000)); 
    } 
    public static boolean isPrime(long prime){ 
     boolean isPrime = true; 
     if(prime%2==0) 
      return false; 
     for(int i = 3;i<=Math.pow(prime, 0.5);i+=2){ 
      if(prime%i==0){ 
       return false; 
      } 
     } 
     return isPrime; 
    } 
    public static int sumPrimeNumber(long max){ 
     long sum = 0; 
     int prime = 3; 
     while(prime < max){ 
      if(isPrime(prime)){ 
       sum += prime; 
      } 
      prime += 2; 
     } 
     return sum + 2; 
    } 
} 
+0

sadece 2 milyondur ve aynı zamanda bir int yanıtını da verir. –

+0

arasında en az 1000 sayı olduğunu düşünmüyor musunuz? 1.000.000 ve 2.000.000 asal? Bunların toplamı kesinlikle taşacak. –

+0

"sumPrimeNumber" türünün dönüş türünü de "long" olarak değiştirmelisiniz (Bir düzenleme önerdim, ancak "_Change ints longs._" öğesine rağmen üç yorumcu "Bu düzenleme, yazının asıl amacından sapıyor" . "). Bu ek düzeltmeyle, kod doğru cevabı verir. Muhtemelen OP'nin kodu 3'ten başladığından ve 2'yi açıkça beyanda eklediğinden, cevabı etkilemese de [rossum düzeltme] 'yi (http://stackoverflow.com/a/36200105/2096401) eklemelisiniz. – TripeHound

0

isPrime() işlevinizde hata var. 2'yi kompozit olarak işaretler, yanlış döndürür.

Değişim için ilk if: Diğer bile numaralar için 2 kişilik true ve false dönecektir

if (prime % 2 == 0) 
    return prime == 2; 

.

+0

Doğru, ancak bu durumda, döngü yalnızca primleri 3'ten itibaren dikkate aldığından önemli değildir (2 iade ifadesine eklenmiştir). – TripeHound

+0

Yönteminizin ismini daha net bir şekilde belirtmek için 'isPrime()' - 'isOddPrime()' şeklinde yeniden adlandırmak en iyisidir. Ya da 2 için operasyonunu düzeltin. Halen isminden bekleneceği gibi çalışmıyor. – rossum

İlgili konular