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();
}
}
}
