C# :: Aufgabe #374
3 Lösungen
Primfaktorzerlegung und Potenzschreibweise
Fortgeschrittener - C#
von JKooP
- 03.04.2021 um 09:53 Uhr
1. Schreibe eine Methode/Funktion, die jede Integer- Zahl in ihre Primfaktoren zerlegen kann
und das Ergebnis als Array/Liste zurückgibt.
Beispiel:
24 = 2*2*2*3
Lösung:
a = { 2, 2, 2, 3 }
2. Schreibe eine weitere Methode/Funktion, die die Werte des Arrays aus Aufgabe 1
in Potenzschreibweise überführt und auf dem Bildschirm ausgibt.
Das Zeichen zur Darstellung kann je nach Vorliebe/Programmiersprache variieren (^, **, h, ...).
Lösung:
2*2*2 = 2^3
3 = 3^1
Ausgabe:
2^3 * 3^1
Viel Spaß
und das Ergebnis als Array/Liste zurückgibt.
Beispiel:
24 = 2*2*2*3
Lösung:
a = { 2, 2, 2, 3 }
2. Schreibe eine weitere Methode/Funktion, die die Werte des Arrays aus Aufgabe 1
in Potenzschreibweise überführt und auf dem Bildschirm ausgibt.
Das Zeichen zur Darstellung kann je nach Vorliebe/Programmiersprache variieren (^, **, h, ...).
Lösung:
2*2*2 = 2^3
3 = 3^1
Ausgabe:
2^3 * 3^1
Viel Spaß
Lösungen:
using System;
using System.Collections.Generic;
namespace Primfaktor
{
class Program
{
static void Main(string[] args)
{
Console.Write("Bitte gib deine Zahl ein: ");
int zahl = Convert.ToInt32(Console.ReadLine());
int original = zahl;
int count2 = 0;
int count3 = 0;
List<int> liste = new List<int>();
while (zahl % 2 == 0 || zahl % 3 == 0)
{
if (zahl % 2 == 0)
{
zahl = zahl / 2;
liste.Add(2);
count2++;
};
if (zahl % 3 == 0)
{
zahl = zahl / 3;
liste.Add(3);
count3++;
}
}
Console.Write(original+" = ");
for (int i = 0;i < liste.Count; i++)
{
if (i == 0)
{
Console.Write(liste[i] + " ");
}
else Console.Write(" * " + liste[i]);
if (i == liste.Count-1)
{
Console.Write(" * ");
}
}
Console.WriteLine(zahl);
if (liste.Count == 0)
{
Console.WriteLine("Du Idiot hast eine Primzahl eingegeben!");
}
if (count2 != 0)
{
Console.Write(original+" = "+"2^"+count2+" * ");
if (count3 == 0)
{
Console.WriteLine(zahl);
}
}
if (count3 != 0)
{
if (count2 != 0)
{
Console.WriteLine("3^" + count3 +" "+ " * "+zahl);
}
else Console.WriteLine(original+" = "+"3^" + count3 +" "+" * "+zahl);
}
}
}
}
using System;
using System.Collections.Generic;
/*
Dieser Code wurde Geschrieben von Damian Scherl
*/
namespace int_in_primzahlen_zerlegen
{
class Program
{
static void Main(string[] args)
{
int zahl1 = 1;
int zahl2 = zahl1;
List<int> zahlenliste1 = new List<int>();
while (zahl1 != 999) //Solange nicht 999 eingegeben wird, wird das Programm ausgeführt -- 999 enspricht hier exit
{
Console.WriteLine("------------------------------------------------\nGib eine Zahl ein (Mit 999 wird abgebrochen"); //Eigabe neue Zahl.
zahl1 = Convert.ToInt32(Console.ReadLine());
zahl2 = zahl1;
int teiler = 1; //Der Teiler muss auf 1 gesetzt werden da sonst beim Eingeben einer zweiten Zahl eine endloschleife beginnt.
zahlenliste1.Clear();
do //Mittels der do while Schleife kann zuerst der Inhalt vor der ersten überprüfung ausgeführt werden.
{
teiler++; //Bei jedem durchlauf die Zahl teiler um 1 erhöhen
while (zahl1 % teiler == 0) //solange zahl1 / Teiler = 0 Rest ergiebt, gibt der Inhalt ausgeführt
{
zahlenliste1.Add(teiler); //Lässt sich zahl 1 durch den teiler mit 0 teilen entspricht der teiler einer Primzahl
zahl1 = zahl1 / teiler; //Damit aber nicht unendlich lange der Selbe Teiler ausgegen wird errechnen wir hier eine neue Zahl 1
//Somit wird aber jetzt statt beispielsweise 10 (erstbeste Primzahl ist 2) mit 5 also zahl 1 gerechnet.
}
if (zahl1 <= 1) // Dies dient nur der Sicherheit falls sich beim rechnen ein Negativer Wert oder 1 Ergibt. Dann wird das Programm abgebrochen.
{
break;
}
} while ((zahl1 / teiler != 1) && (zahl1 % teiler != 0)); //Die Do While schleife läuft so lange zahl 1 durch den teiler dividiert höher ist als 1 oder 0
if (zahl1 > 1) //Da ein negativer wert, 1 oder 0 nicht als Primzahl ausgegeben werden soll prüfen wir zunächst ob die Zahl1 auch höher ist.
{
zahlenliste1.Add(zahl1); //Wir müssen hier die übrige zahl1 auch noch mit andrucken. Diese ist da Finale Element.
}
Console.WriteLine("\nEinzelzahl Ausgabe:");
foreach (var item in zahlenliste1)
{
Console.Write(item+ " ");
}
//Zusammenfassung der zahlen in der Zahlenliste für eine Strukturierte Ausgabe
int laufzahl = 0;
int zahl3 = 1;
Console.WriteLine("\n\nPotenzschreibweise Ausgabe:");
for (int i = 2; i < zahl2; i++)
{
foreach (var item in zahlenliste1)
{
if (i == item)
{
laufzahl++;
zahl3 = i; //Da bei jedem durchlauf um 1 erhöhrt wird und wir nicht möchten das für jede zahl ein ^x ausgegeben wird der wert i in zahl3 geschrieben (unten weiterlesen)
}
}
if (i == zahl3) //da zahl3 nun den wert von i hat und i in der for schleife nur 1x vorkommt können wir unsere Ausgabe so auch nur einmal und nicht mehrfach ausgeben lassen.
{
Console.WriteLine("{0} ^ {1}", i, laufzahl);
laufzahl = 0; //Würde die laufzahl nicht auf 0 gesetzt werden würde diese immer weiter erhöht (2 kommt 2 mal vor 3 kommt 4 mal vor, obwohl 3 nur 2 mal vorkommt)
}
}
Console.WriteLine();
}
}
}
}
NET 5.x; C# 9.x; VS-2019
C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
var n = 24;
var r = n.GetPrimeFactors();
Console.WriteLine($"[{string.Join(", ", r)}]");
Console.WriteLine($"{n} = {r.GetPowerNotation()}");
public static class Extensions
{
public static IEnumerable<int> GetPrimeFactors(this int n)
{
var i = 2;
while (i <= n)
{
if (n % i == 0)
{
n /= i;
yield return i;
}
else i++;
}
}
public static string GetPowerNotation(this IEnumerable<int> lst) =>
string.Join(" * ", lst.GroupBy(x => x).Select(x => new { b = x.Key, e = x.Count() }).Select(x => $"{x.b}^{x.e}"));
}
