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.
GFU-Schulungen  [Anzeige]

VB.NET Aufbau

Sie verfügen nach der Schulung über fundierte Kenntnisse in der Arbeit mit objektorientierten Modellen in VB.NET und können wiederverwendbare Komponenten eigenständig erzeugen.

VB.NET Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

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!