C# :: Aufgabe #331

4 Lösungen Lösungen ö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 Trickster (330 Punkte) - 22.10.2020 um 20:27 Uhr
Quellcode ausblenden C#-Code
using System;

namespace TrainYourProgrammer
{
    class Program
    {
        static void Main(string[] args)
        {
            int zahl;
            int nzahl;
            int result = 0;
            Console.WriteLine("bitte eine Zahl eingeben");
            zahl = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine($"Die wie vielte Zahl, die mit { zahl} beginnt soll angezeigt werden?");
            nzahl = Convert.ToInt32(Console.ReadLine());
            double vorkommastellen = Math.Ceiling(Math.Log10(nzahl));
            double multiplikator = Math.Pow(10, vorkommastellen);
            if (nzahl < multiplikator)
            {
                result = zahl * Convert.ToInt32(multiplikator) + nzahl - 2;
            }

            Console.WriteLine(result);
            Console.ReadLine();
        }
    }
}
vote_ok
von DragStar (2000 Punkte) - 26.10.2020 um 13:20 Uhr
Variante 1:

Quellcode ausblenden C#-Code
using System;

namespace TrainYourProgrammer_331
{
    class Program
    {
        static void Main(string[] args)
        {
            int duration = 1;
            int number = 1;
            int durationCounter = 1;

            do
            {
                string iToString = Convert.ToString(number);
                bool b = iToString.StartsWith("245");

                if (b == true)
                {
                    number = int.Parse(iToString);
                    Console.WriteLine($"{durationCounter}. {number}");
                    durationCounter++;
                    duration++;
                }
                
                number++;

            } while (duration <= 100);

            Console.ReadLine();
        }
    }
}
vote_ok
von JKooP (18090 Punkte) - 17.11.2020 um 20:38 Uhr
NET 5.x; C# 9.x
Neuerung in C# 9.x: Top-Level-Anweisung
https://docs.microsoft.com/de-de/dotnet/csharp/whats-new/csharp-9

Hier Variante 2: Lösung durch Berechnen des Subtrahenden:
Quellcode ausblenden C#-Code
using System;

Console.WriteLine(GetNumber(253, 12));
Console.WriteLine(GetNumber(253, 100));
Console.WriteLine(GetNumber(245, 13_000));

static int GetNumber(int value, int nth)
{
    var lengthZeros = (int)Math.Log10(nth);
    var leadingZeros = new string('0', lengthZeros);
    var subtrahend = 1;
    var length = 0;
    var exponent = 0;

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

    while (true) // Subtrahenden ermitteln: 2, 12, 112 ...
    {
        var power = (int)Math.Pow(10, exponent);
        if (nth >= subtrahend + power)
        {
            subtrahend += power;
            length++;
        }
        else break;
        exponent++;
    }

    return int.Parse(value + (leadingZeros + (nth - subtrahend))[^length..]);
}
vote_ok
von hollst (13980 Punkte) - 04.02.2021 um 18:15 Uhr
Quellcode ausblenden C#-Code
using System;
using static System.Console;

WriteLine(GetNumber(253, 12));
WriteLine(GetNumber(253, 100));
WriteLine(GetNumber(245, 13_000));
ReadKey();

static int func(int n) => n == 0 ? 2 : func(n - 1) + (int)Math.Pow(10, n);

static int GetNumber(int value, int nth)
{
    if (nth < 2) return value;

    int loop = 0;
    while (func(loop++) <= nth) ;

    int diff = nth - func(--loop - 1);
    return value * (int)Math.Pow(10, loop) + diff;
}