Feedback

Primfaktorzerlegung

Sprache: C#

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();

        }
        
    }
}
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

  1. 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.

  2. Generell ist die zum Teil lange Ausführungszeit ein Problem.
    Ich würde empfehlen, den gesamten Algorithmus asynchron laufen zu lassen:

    [code]
    // – Schnell zusammengeschrieben, muss nicht komplett sein 😀

    // 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;} // , wenn IsPrime = true
    }

    public static Task GetPrimeAsync() {
    return Task.Run
    (()=> {
    // 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
    [/code]

    ~Thomas