C# :: Aufgabe #382
1 Lösung
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
Das Programm berechnet dann alle Primzahlen bis zu diesem Wert.
viel Erfolg,
Fuluks
Lösungen:
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.
@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.
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; } } }