04. oktober 2000 - 19:47Der er
12 kommentarer og 1 løsning
Primtals program!!
Jeg skal lave et primtals program - men jeg er kørt fast! Det sorterer kun de ligetal fra. (Det er naevner-for-løkken der er noget i vejen med.. tror jeg..(?)) Hvad gør jeg forkert???
public class PrimTal { public static void main(String[] args) {
int SLUT = 20; double resultat; double naevner;
//System.out.println(\"Udsriver primtal mellem \" + 0 + \" og \" + SLUT);
for (int taeller=1; taeller<=SLUT; taeller++) { for (naevner=2; naevner<taeller; naevner++) { resultat=(double) (taeller/naevner); if (taeller%naevner == 0) { //System.out.println(\"Ikke primtal\"); break; } else System.out.println(taeller); break;
Du er nød til at kontrollere alle tal fra 1 til din tæller, da der er ingen der må gå op i din tæller, primtals generatorer har altid været meget resource krævende pga. af deres rekursivitet... Altså lad din nævner loope indtil den når din tæller, findes der noget der modulo giver nul så hop ud af løkken ellers skriv din tæller ud...
Jeg er godt klar over alt det du skriver - og det er jo også det jeg prøver i ovenstående kode, men jeg kan ikke få det til at lykkes! Hvor er det præcis koden knækker??
prøv denne istedet, den fungerer: public class Primtal{
public Primtal(){}
public boolean isPrime( int number ){ double max = Math.sqrt( (double)number ); for( int counter=2;counter<max;counter++) if( number%counter == 0 ) return false; return true; }
public void printPrimes( int max ){ if( max < 2 ) max=2; for( int counter = 0; counter <=max; counter++ ) if( isPrime(counter)) System.out.println(\"Prime found \"+counter ); }
public static void main( String a[] )throws Exception{ Primtal pt = new Primtal(); pt.printPrimes( Integer.parseInt( a[0] ) ); } }
Tak for dit program - men det er nok lidt for avanceret til at jeg kan tillade mig at bruge det på nuværende tidspunkt! Desuden er alle ulige tal under 20 ikke primtal! (Fx. 9 og 15 er ikke primtal!!)
Alle tal op til tælleren behøves ikke kontrolleres, da en nævner større end halvdelen af tælleren aldrig vil gå op. Yderligere kan der optimeres ved kun at kontrollere med primtallene da alle andre tal er et multiplum af et eller flere af primtallene.
Ja klart, kvadratroden af et multiplum af 2 tal vil altid være større end et af tallene (eller lig med hvis de er ens). Gad vide om der findes smartere metoder end disse.
Jeg tror vi nærmer os noget nær det mest optimale. Dette er ihvertfald de løsninger jeg har fundet på nettet. Ellers skulle man som du selv nævnte gemme de før fundne primtal, og undersøge dem, indtil man er nået til det største, og så ellers fortsatte videre.
Prøv at bruge funktionen IsPrime() i Derive (eller på TI89). Den er RIGTIG hurtig. Jeg har endnu ikke forstået, om den bare returner false over en bestemt størrelse, men så vidt jeg ved, fandt nogle af mine kammerater et kæmpe tal (15 cifre eller noget), og den returnede true efter et par tusindedele sekund! Så effektivt kan man ikke lave det på den ovenfor beskrevne måde (som i øvrigt er den eneste måde, jeg også har ræsonneret mig frem til...)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.