C# :: Aufgabe #61

4 Lösungen Lösungen öffentlich

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

Lösungen:

vote_ok
von eulerscheZhl (5230 Punkte) - 21.11.2014 um 14:02 Uhr
Quellcode ausblenden C#-Code
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);
            }
        }
    }
}
vote_ok
von kjaenke (1140 Punkte) - 07.11.2017 um 08:19 Uhr
Quellcode ausblenden C#-Code
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();
        }
    }
}
vote_ok
von kjaenke (1140 Punkte) - 07.11.2017 um 08:20 Uhr
Quellcode ausblenden C#-Code
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();
        }
    }
}
vote_ok
von hollst (13980 Punkte) - 07.11.2017 um 19:29 Uhr
Quellcode ausblenden C#-Code
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();
        }
    }
}