C# :: Aufgabe #61
4 Lösungen

Austarieren (Mathematisches Problem)
Anfänger - C#
von bibir
- 03.09.2014 um 08:27 Uhr
Der folgenden Aufgabenstellung liegt das Problem des Austarierens zugrunde, wie man es z. B. bei einer Balkenwaage mit einer vorgegebenen Anzahl von Gewichten vorfindet.
Jede natürliche Zahl n lässt sich als Summe von Potenzen zur Basis 3 eindeutig darstellen.
Die Eindeutigkeit dieser Darstellung soll als gesichert vorausgesetzt werden.
Es ist ein Programm/Skript zu schreiben, das zu einer einzulesenden Zahl n <= 2000 den Wert m und die
Koeffizienten berechnet. Die Ausgabe soll wie im Beispiel angegeben erfolgen.
Hinweis: Das m ist gleich dem größten j, für das gilt: 3j < 2n.
Beispiel:
Für n = 46 erhält man m = 4.
Die Ausgabe sieht dann folgendermaßen aus:
n = 46
m = 4
46 =
+3**4
-3**3
-3**2
+3**0
Jede natürliche Zahl n lässt sich als Summe von Potenzen zur Basis 3 eindeutig darstellen.
Die Eindeutigkeit dieser Darstellung soll als gesichert vorausgesetzt werden.
Es ist ein Programm/Skript zu schreiben, das zu einer einzulesenden Zahl n <= 2000 den Wert m und die
Koeffizienten berechnet. Die Ausgabe soll wie im Beispiel angegeben erfolgen.
Hinweis: Das m ist gleich dem größten j, für das gilt: 3j < 2n.
Beispiel:
Für n = 46 erhält man m = 4.
Die Ausgabe sieht dann folgendermaßen aus:
n = 46
m = 4
46 =
+3**4
-3**3
-3**2
+3**0
Lösungen:

using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace Rextester { public class Program { public static void Main(string[] args) { List<int> coeffs = new List<int>(); Console.WriteLine("n: "); int n = int.Parse(Console.ReadLine()); int tmp = n; while (tmp > 1) { switch (tmp % 3) { case 0: coeffs.Add(0); break; case 1: coeffs.Add(1); break; case 2: coeffs.Add(-1); tmp++; break; } tmp /= 3; } coeffs.Add(1); Console.WriteLine("n = " + n); Console.WriteLine("m = " + (coeffs.Count - 1)); Console.WriteLine(n + " ="); for (int i = coeffs.Count - 1; i >= 0; i--) { if (coeffs[i] == 1) Console.WriteLine("+3**" + i); else if (coeffs[i] == -1) Console.WriteLine("-3**" + i); } } } }

namespace Exercise_61 { using System; using System.Collections.Generic; public static class Program { public static void Main() { List<int> koeffizientList = new List<int>(); Console.WriteLine("n: "); var n = int.Parse(Console.ReadLine() ?? throw new InvalidOperationException()); if (n > 2000) { Console.Clear(); Console.WriteLine("Der Parameter n muss kleiner gleich 2000 sein."); Main(); } var x = n; while (x > 1) { switch (x % 3) { case 0: koeffizientList.Add(0); break; case 1: koeffizientList.Add(1); break; case 2: koeffizientList.Add(-1); x++; break; default: break; } x /= 3; } koeffizientList.Add(1); Console.WriteLine("n = " + n); Console.WriteLine("m = " + (koeffizientList.Count - 1)); Console.WriteLine(n + " ="); for (var i = koeffizientList.Count - 1; i >= 0; i--) { switch (koeffizientList[i]) { case 1: Console.WriteLine("+3**" + i); break; case -1: Console.WriteLine("-3**" + i); break; default: break; } } Console.Read(); } } }

namespace Exercise_61 { using System; using System.Collections.Generic; public static class Program { public static void Main() { List<int> koeffizientList = new List<int>(); Console.WriteLine("n: "); var n = int.Parse(Console.ReadLine() ?? throw new InvalidOperationException()); if (n > 2000) { Console.Clear(); Console.WriteLine("Der Parameter n muss kleiner gleich 2000 sein."); Main(); } var x = n; while (x > 1) { switch (x % 3) { case 0: koeffizientList.Add(0); break; case 1: koeffizientList.Add(1); break; case 2: koeffizientList.Add(-1); x++; break; default: break; } x /= 3; } koeffizientList.Add(1); Console.WriteLine("n = " + n); Console.WriteLine("m = " + (koeffizientList.Count - 1)); Console.WriteLine(n + " ="); for (var i = koeffizientList.Count - 1; i >= 0; i--) { switch (koeffizientList[i]) { case 1: Console.WriteLine("+3**" + i); break; case -1: Console.WriteLine("-3**" + i); break; default: break; } } Console.Read(); } } }

namespace Aufgabe_61 { class Program { static void Main() { int n = 46; aufgabe_61 a61 = new aufgabe_61(n); System.Console.WriteLine(); System.Console.WriteLine(a61.erg_string); System.Console.ReadKey(true); } } //Jede natürliche Zahl n lässt sich als Summe von Potenzen zur Basis 3 eindeutig darstellen. public class aufgabe_61 { public int erg = 0; public string erg_string = string.Empty; public aufgabe_61(int n) { //constructor System.Collections.Generic.List<int> base3 = new System.Collections.Generic.List<int>(); int rest = 0; while(n > 0) { rest = n % 3; n = n / 3; base3.Add(rest); }; int[] values = new int[base3.Count + 1]; base3.ToArray().CopyTo(values, 0); for(var i = 0; i < values.Length; i++) { if(values[i] == 2) { values[i] = -1; values[i + 1] ++; continue; } if (values[i] == 3) { values[i] = 0; values[i + 1]++; continue; } }; int pot = 1; for(var i = 0; i < values.Length; i++) { string s_plus = " + "; if(i == values.Length - 1) s_plus = " = "; erg_string += "(" + values[i].ToString() + " * 3 ** " + i.ToString() + ")" + s_plus; erg += values[i] * pot; pot *= 3; } erg_string += erg.ToString(); } } }