C# :: Aufgabe #385

4 Lösungen Lösungen öffentlich

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ß

Lösungen:

vote_ok
von hollst (13680 Punkte) - 19.04.2021 um 15:07 Uhr
Quellcode ausblenden C#-Code
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();
vote_ok
von dson (430 Punkte) - 19.04.2021 um 19:12 Uhr
Mit Bestimmten Mehrfachausgaben lassen sich alle Zahlen in potenzschreibweisen ausgeben
Quellcode ausblenden 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;
                    }
                }
            }

        }
    }
}

vote_ok
von dson (430 Punkte) - 19.04.2021 um 19:33 Uhr
Quellcode ausblenden C#-Code
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");
            }

        }
    }
}

vote_ok
von JKooP (13960 Punkte) - 20.04.2021 um 20:36 Uhr
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.
Quellcode ausblenden C#-Code
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;
}