Feedback

C# - Primfaktorzerlegung

Veröffentlicht von am 30.07.2015
(0 Bewertungen)
Der folgende Code gibt auf sehr einfache Art alle Primfaktoren einer beliebigen Zahl aus und stellt mein erstes komplett selbst geschriebenes Programm dar. Die Ausgabe kann bei sehr großen Zahlen ohne kleine Teiler ein paar Sekunden dauern.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PrimZahlfaktoren
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Bitte Zahl eingeben: \n");
            Int64 Zahl = Convert.ToInt64(Console.ReadLine());

            if (Zahl == 1){
                Console.WriteLine("Die Zahl ist nicht mehr teilbar, da sie bereits 1 ist.");
            }
            else {
                while (Zahl % 2 == 0)
                {
                    Zahl = Zahl / 2;
                    Console.WriteLine(":" + 2 + " = " + Zahl);
                }
                for (Int64 i = 3; i <= Zahl; i = i+2)
                    while (Zahl % i == 0)
                    {
                        Zahl = Zahl / i;
                        Console.WriteLine(":" + i+" = "+ Zahl);                        
                    }
            }
            Console.ReadLine();

        }
        
    }
}

4 Kommentare zum Snippet

Koopakiller schrieb am 30.07.2015:
Wenn du deinen Code noch verbessern willst, dann gucke hier mal auf der Seite oder auch wo anders im Internet nach effizienteren Primzahl-Algorithmen. Deiner funktioniert zwar (nicht getestet, nur angesehen), ist aber eben doch recht langsam.
Stormageddon schrieb am 31.07.2015:
EDIT: prüfe jetzt erst ob die Zahl == 2 ist und lasse dann nur noch durch ungerade Zahlen teilen.
Koopakiller schrieb am 31.07.2015:
Das ist schon mal um einiges besser. Eine Stufe drauf legen kannst du noch, wenn du mal nach "Sieb von Atkin" recherchierst.
Thomas Roskop schrieb am 07.09.2015:
Generell ist die zum Teil lange Ausführungszeit ein Problem.
Ich würde empfehlen, den gesamten Algorithmus asynchron laufen zu lassen:


// - Schnell zusammengeschrieben, muss nicht komplett sein :D

// Rückgabewert als Struktur speichern
public struct PRIME_RESULT {
public bool IsPrime {get; set;} // True, wenn es keine Primzahl gibt.
public int[] Primes {get; set;} // <null>, wenn IsPrime = true
}

public static Task<PRIME_RESULT> GetPrimeAsync() {
return Task.Run<PRIME_RESULT>(()=> {
// Algorithmus anwenden und PRIME_RESULT-Instanz zurückgeben.
// ...
});
}
// Für Task.Run() siehe auch:
// https://msdn.microsoft.com/de-de/library/hh194918%28v=vs.110%29.aspx


~Thomas
 

Logge dich ein, um hier zu kommentieren!