C++ :: Aufgabe #304

1 Lösung Lösung öffentlich

Die n-te Zahl ermitteln

Fortgeschrittener - C++ von JKooP - 04.10.2020 um 11:30 Uhr
Man nehme eine Zahl, die beispielsweise mit den Ziffern 245 beginnt.
Nun ist die Frage, welche ist z.B. die 12. Zahl, die ebenfalls mit 245 beginnt?

Lösung: 24500, denn
01. 245
02. 2450
03. 2451

11. 2459
12. 24500

Welche ist die 100. Zahl die mit 245 beginnt?

Variante 1: durch Probieren mittels einer Schleife (leicht)

Versucht man jetzt aber durch Probieren die 13000. Zahl zu ermitteln, kann das schon eine Weile dauern. Vielleicht lässt sich eine logische Folge ableiten?!

Variante 2: Berechnung der Zahl (schwieriger)

Viel Spaß

Lösungen:

vote_ok
von JKooP (18090 Punkte) - 17.11.2020 um 20:18 Uhr
C++ 17; Visual Studio 2019
Hier die Variante 2: Lösung durch Berechnen des Subtrahenden:
Quellcode ausblenden C-Code
#include <iostream>
#include <string>
using namespace std;

int get_number(const int&, const int&);

int main()
{
    cout << get_number(245, 12) << endl;
    cout << get_number(245, 100) << endl;
    cout << get_number(245, 13'000) << endl;
}

int get_number(const int& value, const int& nth)
{
    const auto& lengthZeros{ (int)log10(nth) };
    const auto& leadingZeros{ string(lengthZeros, '0') };
    auto subtrahend{ 1 };
    auto length{ 0 };
    auto exponent{ 0 };

    if (nth == 0 || nth == 1) return value;

    while (true) // Subtrahenden ermitteln: 2, 12, 112 ...
    {
        auto power = (int)pow(10, exponent);
        if (nth >= subtrahend + power)
        {
            subtrahend += power;
            length++;
        }
        else break;
        exponent++;
    }
    const auto& l{ (leadingZeros + to_string(nth - subtrahend)) };
    return stoi(to_string(value) + l.substr(l.length() - length, length));
}