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();
}
}
}
Alte URL:
/snippet/primfaktorzerlegung/7989
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.
EDIT: prüfe jetzt erst ob die Zahl == 2 ist und lasse dann nur noch durch ungerade Zahlen teilen.
Das ist schon mal um einiges besser. Eine Stufe drauf legen kannst du noch, wenn du mal nach „Sieb von Atkin“ recherchierst.
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, wenn IsPrime = true
public struct PRIME_RESULT {
public bool IsPrime {get; set;} // True, wenn es keine Primzahl gibt.
public int[] Primes {get; set;} //
}
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