C# :: Aufgabe #374

3 Lösungen Lösungen öffentlich

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ß

Lösungen:

vote_ok
von C# Anfänger (60 Punkte) - 06.04.2021 um 21:58 Uhr
Quellcode ausblenden C#-Code
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);
            }
        }
    }
}
vote_ok
von dson (640 Punkte) - 16.04.2021 um 16:27 Uhr
Quellcode ausblenden C#-Code
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();

            } 

        } 

    }

}
vote_ok
von JKooP (18090 Punkte) - 17.04.2021 um 13:57 Uhr
NET 5.x; C# 9.x; VS-2019
Quellcode ausblenden 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}"));
}
1813750

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.