Avatar billede wermelin Nybegynder
04. oktober 2000 - 19:47 Der 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;
                           
                           
                   
                    } 
            }
    }
}
Avatar billede kasseper Nybegynder
04. oktober 2000 - 20:21 #1
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...
Avatar billede wermelin Nybegynder
04. oktober 2000 - 20:24 #2
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??
Avatar billede lbhansen Nybegynder
04. oktober 2000 - 20:39 #3
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] ) );
        }
}
Avatar billede lbhansen Nybegynder
04. oktober 2000 - 20:42 #4
Den er god nok!!!!
Alle ulige tal under 20 er primtal:-)
Avatar billede wermelin Nybegynder
04. oktober 2000 - 20:47 #5
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!!)
Avatar billede lbhansen Nybegynder
04. oktober 2000 - 21:12 #6
Ok. Du har ret. Min Upser. beklager
Avatar billede zyke Nybegynder
05. oktober 2000 - 12:19 #7
Hvorfor gøre det så indviklet, hvorfor ikke bare skrive:

public class primes
{
    public static void main(String args[])
    {
    boolean a = true;
    int min = 1, max = 20;

    System.out.print(\"I intervallet \" + min + \" til \" + max + \" er der følgende primtal: \");
   
        for(int n = min; n <= max; n++)
        {
            for(int j=2; j <= n/2; j++)
            {
                if(n%j == 0)
                {
                    a = false;
                    break;
                }
                else
                    a = true;
            }
            if(a == true)
                System.out.print(n + \" \");
        }
    }
}

Hvad siger du ibhansen?
Avatar billede lbhansen Nybegynder
05. oktober 2000 - 13:31 #8
Det er ikke besværligt, der er tale om fornuftig programmering, hvor metoder har sigende navne.
Vi kan jo ikke alle leve med public static void main
Avatar billede codemon Nybegynder
05. oktober 2000 - 20:14 #9
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.

/codemon
Avatar billede lbhansen Nybegynder
05. oktober 2000 - 20:21 #10
Det er rigtigt. Faktisk er der matematisk grundlag for, at man kun behøver at søge op til kvadratroden af det tal man undersøger
Avatar billede codemon Nybegynder
05. oktober 2000 - 20:29 #11
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.
Avatar billede lbhansen Nybegynder
05. oktober 2000 - 21:36 #12
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.
Avatar billede kaspar Nybegynder
27. november 2000 - 15:49 #13
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...)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester