2017-04-11 4 views
-2

Also ich versuche zu tun, was ich dachte, wäre ein einfaches Problem in Java. Ich weiß nicht, ob es so ist, weil ich neu in Java bin, oder dass ich nur einen dummen Fehler mache, aber ich bekomme 3341, was die falsche Antwort ist.Projekt Euler # 53: Was mache ich falsch?

Link zur Frage: https://projecteuler.net/problem=53

import java.math.BigInteger; 

public class Main { 

public static BigInteger[] factorial = new BigInteger[101]; 
static public void main(String[] args) 
{ 
    factorial[0] = BigInteger.ONE; 
    for(int i = 1; i <= 100; i++) 
     factorial[i] = factorial[i-1].multiply(BigInteger.valueOf(i)); 

    int count = 0; 

    for(int n = 1; n <= 100; n++) 
    { 
     for(int r = 0; r <= n; r++) 
     { 
      if(choose(n, r) > 1000000) 
      { 
       count++; 
      } 

     } 
    } 
    System.out.println("There are " + count + " values > 1,000,000 "); 
} 

static public long choose(int n, int r) 
{ 
    return (factorial[n].divide((factorial[r].multiply(factorial[n-r])))).longValue(); 
} 

}

+0

ich Hilfe hier schon einmal auf einer euler Frage bekommen habe, nicht die Dutzende von anderen euler Fragen zu erwähnen, dass legitime Antworten bekommen haben . Ich frage nicht nach dem richtigen Code, nur einen Hinweis darauf, was ich falsch mache. Ich habe mir diesen Code schon lange angesehen und habe keine Ahnung, was damit nicht stimmt. –

+0

Kann also jemand im Kontext dessen, was ich oben erwähnt habe, erklären, warum meine Frage abgelehnt wurde? –

+0

Empfehlen Sie einen Link zur aktuellen Frage hinzuzufügen – eshirima

Antwort

0

Einige dieser Zahlen sind ziemlich groß. Sicherlich größer als würde in einen long Wert passen.

Versuchen Sie, alle Berechnungen, einschließlich der Vergleiche, als BigInteger.

public static BigInteger choose(int n, int r) 
{ 
    return factorial[n].divide(factorial[r].multiply(factorial[n - r])); 
} 

Und dann im Haupt Code, so etwas wie:

final BigInteger max = BigInteger.valueOf(1000000); 

for (int n = 1; n <= 100; n++) 
{ 
    for (int r = 0; r <= n; r++) 
    { 
     if (choose(n, r).compareTo(max) > 0) 
     { 
      count++; 
     } 
    } 
} 
+0

Danke. Ich weiß nicht, warum ich angenommen habe, dass die Zahlen klein genug wären, um lange zu passen. –