18. december 2007 - 19:33Der er
34 kommentarer og 2 løsninger
Do while løkke inde i en for løkke til løsning af primtal
Godaften,
Jeg har følgende kode, der skal bruges til at finde primtal, hvor jeg undersøger om et tal kan opløses af andre tal. Jeg lavede det først med to for-løkker, dette virkede fint men der blev foretaget mange unødvendige beregninger. Jeg tænkte at jeg kunne bruge en do while løkke, så programmet hoppede til næste tal hvis det udregnede at der var et tal, der gik op i det. Jeg har følgende kode, men den virker ikke. Er der nogen der kan se hvad jeg gør forkert? :)
Grunden til jeg gør det på denne måde er at det skal udføres efter den matematiske model, Sieve of Eratosthenes. Men koden kunne måske stadig optimeres?
Man starter med et aray op til den størelse man ønsker at finde primtallene inden for.
Trin 1) Så starter man med 2. Fra denne sætter man et hak henover alle multipla af 2: 4, 6, 8, 10, ... indtil man løber "ovenud" af arrayet.
Trin 2) Derefter går man vidre til det næste tal hvor der ikke allerede er et hak. Det er 3. Fra denne sætter man et hak henover alle multipla af 3: 6, 9, 12, 15, ... indtil man løber "ovenud" af arrayet.
Trin 3) Derefter går man vidre til det næste tal hvor der ikke allerede er et hak. Det er 5 (4 er der allered et hak i). Fra denne sætter man et hak henover alle multipla af 5: 10, 15, 20, 55, ... indtil man løber "ovenud" af arrayet.
... og sådan fortsætter man:
Trin 4) 6 er hallet af. 7 er det næste ...
Trin 5) 8 er hakket af, 9 er hakket af, 10 er hakket af, 11 er den næste ...
... og sådan fortsætter man ....
- til at man løber "ovenud" arrayet og ikke kan fortsætte mere.
streg alle multipla af 2: 4, 6, 8, 10 streg alle multipla af 3: 6, 9
2, 3, 5 og 7 er tilbage
(det er ikke noedvendigt at strege multipla af 5 og 7 da de er stoerre end kvadratroden af 10 og der er ingen grund til at strege multipla af noget der ikke er primtal)
Mit bedste eksempel er: for(i=start;i<ulimit;i++){ for(j=2;j<i;j++){ u = i%j; if(u==0){ table[i] = 0; break; } }
}
Hvor start og ulimit er den nedre og øvre grænse for det interval, der skal søges efter primtal i. Men det er jo ikke den rigtigt algoritme. Jeg må indrømme, jeg ikke helt forstår hvad jeg skal lave om?
EoS starter altid fra 2 af. Du kan ikke starte andre steder, ellers giver den forkerte resultater.
Dernæst synes jeg at du skal glemme alt om den eksisterende kode, og kigge på beskivelserne i 18/12-2007 20:13:20 eller i 18/12-2007 20:14:33. Hvordan eftergøre du bedst dem med et array og to løkker.
Hehe ja okay, jeg er forholdsvis ny indenfor programmering, hvis du ikke har bemærket det ;) men jeg har brug for lidt hjælp til at komme igang med at lave min egen algoritme
Vi skal ikke krydse af ud for tallet selv. Vi skal først starte fra det første multiplum:
afkrydsTal = tal+tal (= 2*tal)
Vi skal fortsættt med at krydse af indtil at vi når ud over neden af der hvor sien går til:
afkrydsTal <= maksTal
Vi skal krydse af for hvert multiplum. Dvs når vi har krydet af ud for tallet afkrydsTal, så er det næste tal vi skal krydse af ved lig med afkrydsTal+tal.
afkrydsTal = afkrydsTal + tal
(hvilket kan skrives på den kortere form: "afkrydsTal += tal")
Jeg har overhovedet ikke opgivet det, jeg har bare haft meget arbejde her mellem jul og nytår, så har slet ikke fået set på det. Men det har jeg nu, og jeg forstår det må jeg sige, endelig :P
Du skal have mange tak for hjælpen :) Gider du smide et svar?
Nu var I begge så behjælpelige så I får lov til at dele om pointene :) Men mange tak for hjælpen.
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.