C# :: Aufgabe #382

1 Lösung Lösung öffentlich

Alle Primzahlen bis n

Anfänger - C# von Fuluks - 13.11.2020 um 09:30 Uhr
Ein Programm/Methode bei der ein Wert übergeben wird.
Das Programm berechnet dann alle Primzahlen bis zu diesem Wert.

viel Erfolg,
Fuluks

Lösungen:

vote_ok
von JKooP (18090 Punkte) - 15.04.2021 um 16:50 Uhr
NET 5.x; C# 9.x; VS-2019
@Fuluks: man kann leider noch keine Primzahlen berechnen; aber ich denke du meintest ermitteln.

Hier mal 3 Möglichkeiten zur Ermittlung von Primzahlen.
Die Methode Test misst die Zeit der unterschiedlichen Methoden.
Das Ergebnis zeigt, dass man mit LINQ zwar schnell übersichtlichen Code schreiben kann,
am Ende aber doch die Performance stark leidet.
Ab 1.000.000 Durchläufen ist die LINQ- Variante (IsPrime2) leider nicht mehr zu gebrauchen.
Quellcode ausblenden C#-Code
using System;
using System.Linq;
using System.Diagnostics;
using System.Collections.Generic;

namespace CS_TYP_Aufgabe_382_Primzahlen
{
    class Program
    {
        delegate bool IsPrime(int n);

        static void Main(string[] args)
        {
            var lst = new List<IsPrime>() { IsPrime1, IsPrime2, IsPrime3 };

            foreach (var l in lst)
            {
                var (name, time) = Test(l, 100_000);
                Console.WriteLine($"{name}: {time} ms\n");
            }
        }

        static (string name, double time) Test(IsPrime ip, int n)
        {
            Stopwatch sw = new();

            sw.Start();
                for (int i = 0; i < n; i++)
                    _ = ip(i);
            sw.Stop();

            return (ip.Method.Name, sw.Elapsed.TotalMilliseconds);
        }

        static bool IsPrime1(int n) => n switch
        {
            2 => true,
            var k when k > 2 => !Enumerable.Range(2, (int)Math.Ceiling(Math.Sqrt(n)) - 1).Any(x => n % x == 0),
            _ => false
        };

        static bool IsPrime2(int n) => n > 1 && Enumerable.Range(1, n).Where(x => n % x == 0).SequenceEqual(new[] { 1, n });

        static bool IsPrime3(int n)
        {
            if (n == 0 || n == 1) return false;
            if (n == 2) return true;
            for (int i = 2; i <= (int)Math.Ceiling(Math.Sqrt(n)); i++)
                if (n % i == 0) return false;
            return true;
        }
    }
}
1810387

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.