C# :: Aufgabe #385
4 Lösungen

Zahl ist Summe von Potenzwerten zur Basis 3
Anfänger - C#
von JKooP
- 18.04.2021 um 12:49 Uhr
Gegeben ist eine Integer-Zahl im Bereich von 1 bis 1.000.000.
Es soll geprüft werden, ob sich diese Zahl als Summe von Potenzwerten
zur Basis 3 darstellen lässt. Die Reihenfolge der Exponenten ist unerheblich.
Beispiele:
n = 12
Lösung: wahr => 12 = 3^1 + 3^2
n = 91
Lösung: Wahr => 3^0 + 3^2 + 3^4
n = 105
Lösung: Falsch
Erstelle eine Methode/Funktion, die für obige Aufgabenstellung als Ergebnis true/false zurückgibt.
Viel Spaß
Es soll geprüft werden, ob sich diese Zahl als Summe von Potenzwerten
zur Basis 3 darstellen lässt. Die Reihenfolge der Exponenten ist unerheblich.
Beispiele:
n = 12
Lösung: wahr => 12 = 3^1 + 3^2
n = 91
Lösung: Wahr => 3^0 + 3^2 + 3^4
n = 105
Lösung: Falsch
Erstelle eine Methode/Funktion, die für obige Aufgabenstellung als Ergebnis true/false zurückgibt.
Viel Spaß
Lösungen:

using System; using static System.Console; using System.Collections.Generic; static bool Aufgabe_385(int input) { int temp = 1; List<int> pot3 = new() { temp }; while ((temp *= 3) <= input) pot3.Add(temp); for (var i = pot3.Count - 1; i >= 0; i--) if (pot3[i] <= input) input -= pot3[i]; return input == 0; } for (var i = 1; i < 100; i++) WriteLine($"{i,3}: {Aufgabe_385(i)}"); ReadKey();
Mit Bestimmten Mehrfachausgaben lassen sich alle Zahlen in potenzschreibweisen ausgeben
C#-Code

using System; namespace potenzschreibweise_zu_drei { class Program { static void Main(string[] args) { int n = 10501; int zahl1 = n; while (zahl1 != 0) { for (int i = zahl1; i > 0; i--) { if (Math.Log(i, 3) % 1 == 0) { Console.WriteLine("3^" + Math.Log(i, 3)); //Berechnet den Logarythmus mit einer Base von 3 (3^4 = 81 somit wird hier 4 zurück gegeben) zahl1 = zahl1 - i; break; } } } } } }

using System; using System.Collections.Generic; namespace potenzschreibweise_zu_drei { class Program { static void Main(string[] args) { int n = 91; int zahl1 = n; //Zahl1 wird nur verwendet um den orginalen Wert ggf. nicht zu veränden. int zahl2 = 0; //Dienst der entscheidung ob die Zahl einfach in 3er Potenzen geschrieben werden kann. bool exit = false; List<string> ausgabe = new List<string>(); while (zahl1 != 0) { for (int i = zahl1; i > 0; i--) { if (Math.Log(i, 3) % 1 == 0) { if (i == zahl2) //Muss eine 3er Potenz mehrfach verwendet werden, so ist die Start Zahl falsch und die Schleie wird beendet. { exit = true; //damit auch die While schlefie beendet wird, habe ich hier noch einen Zusätzlichen Wert, welcher vor der While schließen Klammer verwendet wird. break; } ausgabe.Add("3^" + Math.Log(i, 3)); //Berechnet den Logarythmus mit einer Base von 3 (3^4 = 81 somit wird hier 4 zurück gegeben) zahl1 = zahl1 - i; zahl2 = i; break; } } if (exit == true) { break; } } if (exit == true) //Wurde die Schleife mittels break beendet weil die Zahl mehere 3er Potenzen beinhaltet soll Falsch ausgegeben werden { Console.WriteLine("Lösung: Falsch"); } else //ist die schleife ohne doppelte Potenz durchgelaufen ist die Lösung richtig und alle Ergebnisse werden ausgeben. { foreach (var item in ausgabe) { Console.WriteLine(item); } Console.WriteLine("Lösung: Wahr"); } } } }
NET 5.x; C# 9.x; VS-2019
Ich bin mathematisch an die Aufgabe herangegangen. Umwandlung in eine ternäre Zahl.
Enthält die Zahl die Ziffer 2, so ist sie nicht als Summe von Potenzwerten zur Basis 3 darstellbar.
C#-Code
Ich bin mathematisch an die Aufgabe herangegangen. Umwandlung in eine ternäre Zahl.
Enthält die Zahl die Ziffer 2, so ist sie nicht als Summe von Potenzwerten zur Basis 3 darstellbar.

using System; using System.Linq; Enumerable.Range(1, 100).ToList().ForEach(x => Console.WriteLine($"{x,3} {IsPowersOfThree(x)}")); static bool IsSumOfPowersOfThree(int n) { while (n > 0) { if (n % 3 == 2) return false; n /= 3; } return true; }