Avatar billede visualdeveloper Nybegynder
03. oktober 2005 - 21:57 Der er 15 kommentarer og
1 løsning

Simpel løkke til primtal !

Jeg har dette program som jeg ikke helt kan få til at virke...der kommer en uendelig løkke:

using System;

class Primtal
{
    static void Main()
    {
        int i = 0;
        int max = 50;

        Console.WriteLine("2");
        Console.WriteLine("3");
       
        do
        {
            i++;
            while(i%2!=0 && i%3!=0)
            {
                Console.WriteLine(i);
            }
        }while(i<max);

        Console.WriteLine("Her har du de 50 første primtal !");
        Console.ReadLine();
    }
}
Avatar billede arne_v Ekspert
03. oktober 2005 - 21:58 #1
du tæller ikke i op i den inderste while løkke
Avatar billede arne_v Ekspert
03. oktober 2005 - 21:59 #2
at 2 og 3 ikke går op i i er iøvrigt ikke garanti for et primtal

du er nødt til at checke fra 2 og op til sqrt(i)
Avatar billede arne_v Ekspert
03. oktober 2005 - 21:59 #3
og når du har det til at virke så prøv og kig på Sieve of Erastohnes
Avatar billede nielle Nybegynder
04. oktober 2005 - 08:53 #4
Den inderste løkke skulle jo nok have været en if-sætning i stedet for en while-løkke.

I øvrigt har Arne helt ret mht. matematikken (bortset fra at algoritmen hedder "Sieve of Erastothenes").
Avatar billede arne_v Ekspert
04. oktober 2005 - 09:10 #5
jeg må undskylde overfor miste Elangtnavn
Avatar billede visualdeveloper Nybegynder
04. oktober 2005 - 14:17 #6
nu er jeg ikke nogen særlig garvet c# programmør..kan i ikke komme med et så simpelt som muligt eksempel på fx max = 100 (primtal til 100)
i et simpelt konsolvindue !
Avatar billede arne_v Ekspert
04. oktober 2005 - 14:26 #7
en hurtig (læs: check for fejl):

using System;

namespace E
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int n = 0;
            int i = 2;
            while(n < 100)
            {
                bool prim = true;
                for(int j = 2; j <= (int)Math.Sqrt(i); j++)
                {
                    if(i % j == 0)
                    {
                        prim = false;
                        break;
                    }
                }
                if(prim)
                {
                    Console.WriteLine(i);
                    n++;
                }
                i++;
            }
        }
    }
}
Avatar billede nielle Nybegynder
04. oktober 2005 - 14:43 #8
F.eks. sådan her:

using System;
using System.Collections;

namespace e653068
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            ArrayList Primtal = new ArrayList();
            Primtal.Add(2);

            for (int MuligtPrimtal=3; MuligtPrimtal<=100; MuligtPrimtal+=2)
            {
                bool ErEtPrimtal = true;
                int FaktorGrænse = (int) Math.Floor(Math.Sqrt(MuligtPrimtal));

                for (int PrimtalIdx=0; PrimtalIdx<Primtal.Count; PrimtalIdx++)
                {
                    int Faktor = (int) Primtal[PrimtalIdx];

                    if (Faktor > FaktorGrænse) break;

                    if (MuligtPrimtal % Faktor == 0)
                    {
                        ErEtPrimtal = false;
                        break;
                    }
                }

                if (ErEtPrimtal) Primtal.Add(MuligtPrimtal);
            }

            foreach (int EtPrimtal in Primtal)
            {
                Console.WriteLine(EtPrimtal);
            }
        }
    }
}
Avatar billede arne_v Ekspert
04. oktober 2005 - 15:09 #9
hvis det er primtal op til 100 og ikke 100 primtal så vil min kode se ud som:

using System;

namespace E
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            for(int i = 0; i < 100; i++)
            {
                bool prim = true;
                for(int j = 2; j <= (int)Math.Sqrt(i); j++)
                {
                    if(i % j == 0)
                    {
                        prim = false;
                        break;
                    }
                }
                if(prim)
                {
                    Console.WriteLine(i);
                }
            }
        }
    }
}
Avatar billede visualdeveloper Nybegynder
04. oktober 2005 - 22:20 #10
mange tak arne læg et svar og få dine points
Avatar billede arne_v Ekspert
04. oktober 2005 - 22:21 #11
gerne

men nielles løsning er faktisk en anelse mere avanceret da han kun dividerer med
primtal ikke med alle tal
Avatar billede nielle Nybegynder
05. oktober 2005 - 06:58 #12
Min løsning kan finpuses en smule ved at ændre den indre løkke, fra:

    for (int PrimtalIdx=0; PrimtalIdx<Primtal.Count; PrimtalIdx++)

- til:

    for (int PrimtalIdx=1; PrimtalIdx<Primtal.Count; PrimtalIdx++)

Idet min ydre løkke springer alle de lige tal over:

    for (int MuligtPrimtal=3; MuligtPrimtal<=100; MuligtPrimtal+=2)

- er der jo ingen grund til at prøve at dividere med primtallet 2. :^)
Avatar billede nielle Nybegynder
05. oktober 2005 - 10:13 #13
using System;
using System.Collections;

namespace e653068
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            ArrayList Primtal = new ArrayList();

            Primtal.Add(2);  // 2 er et primtal.

            // Vi løber igennem de mulige primtal, og springer samtlige de lige tal over.
            for (int MuligtPrimtal=3; MuligtPrimtal<=100; MuligtPrimtal+=2)
            {
                // Tallet er et primtal indtil det modsatte er bevist.
                bool ErEtPrimtal = true;

                // Hvis tallet ikke er et primtal, må mindst en af dividenderne
                // være mindre end kvadratroden af tallet. Der er derfor ikke nogen
                // grund til at undersøge dividender, som er større end kvadratroden.
                int MaksDividend = (int) Math.Floor(Math.Sqrt(MuligtPrimtal));

                // Når vi tjekker de mulige dividender, er det ikke nødvendigt at
                // teste for andet end primtal-dividender. Desuden kan vi springe
                // primtallet 2 over idet tallet - pga. den ydre løkke - altid er ulige.
                for (int PrimtalIdx=1; PrimtalIdx<Primtal.Count; PrimtalIdx++)
                {
                    // Tjek for denne dividend.
                    int Dividend = (int) Primtal[PrimtalIdx];

                    // Hvis den er større end MaksDividend er der ingen grund til
                    // at fortsætte løkken.
                    if (Dividend > MaksDividend) break;

                    // Går dividenden op i tallet?
                    if (MuligtPrimtal % Dividend == 0)
                    {
                        ErEtPrimtal = false;  // Ja! Dermed er tallet ikke et primtal.
                        break;  // ... og der er ingen grund til at fortsætte løkken.
                    }
                }

                // Hvis tallet kom helskinnet igennem løkken er det et primtal.
                if (ErEtPrimtal) Primtal.Add(MuligtPrimtal);
            }

            // Udskriv de fundne primtal.
            foreach (int EtPrimtal in Primtal)
            {
                Console.WriteLine(EtPrimtal);
            }
        }
    }
}
Avatar billede visualdeveloper Nybegynder
05. oktober 2005 - 14:53 #14
jamen så bare læg et svar nielle
Avatar billede nielle Nybegynder
05. oktober 2005 - 15:29 #15
Det var nu ikke for at få point - jeg kan bare meget godt lide matematikken bag primtallene. ;^)

... ikke noget svar for mig. :^)
Avatar billede visualdeveloper Nybegynder
05. oktober 2005 - 15:56 #16
se det er rigtig exp ånd ;) god karma til dig !
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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