C# :: Aufgabe #199 :: Lösung #4

5 Lösungen Lösungen öffentlich
#199

Ermittlung von Zeilen- und Spaltennummer eines 2D-Array-Feldes

Anfänger - C# von hollst - 09.02.2018 um 11:03 Uhr
Die Felder eines "unendlich" großen 2D-Arrays seien nach folgendem "Diagonal-Schema" nummeriert:

1 2 4 7 . . .
3 5 8 . . . .
6 9 . . . . .
10 . . . . . .
. . . . . . usw.

Man schreibe ein Programm, das für eine gegebene Feldnummer N die Zeilen- (ZN) und die Spaltennummer (SN) zurückgibt.
Zeilen- und Spaltennummerierungen beginnen wie üblich mit 0.

Beispiele:
N = 8 -> ZN = 1, SN = 2
N = 31 -> ZN = 2, SN = 5
#4
vote_ok
von hollst (13980 Punkte) - 11.04.2018 um 13:53 Uhr
Quellcode ausblenden C#-Code
using System;
using static System.Console;

/*  
Ermittlung von Zeilen- und Spaltennummer eines Array-Feldes

Die Felder eines 2D-Arrays seien nach folgendem "Diagonal-Schema" nummeriert:

 1 2 4 7 . . .
 3 5 8 . . . .
 6 9 . . . . .
10 . . . . . .
 . . . . . . usw.

Man schreibe ein Programm, das für eine gegebene Feldnummer N die Zeilen- (ZN) 
und die Spaltennummer (SN) zurückgibt. Zeilen- und Spaltennummerierungen 
beginnen wie üblich mit 0.

Beispiele: N =  8 -> ZN = 1, SN = 2
           N = 31 -> ZN = 2, SN = 5 
*/

class MAIN    {
    static void Main()    {
        uint N = 0;
        bool bo_exit = false;

        WriteLine(give_1_numbers(100));

        while (!bo_exit)    {
            bool bo_input_ok = false;
            while (!bo_input_ok)    {
                Write("give me N (> 0): ");
                bo_input_ok = uint.TryParse(ReadLine(), out N) && (N > 0);
            }

            Algorith alg = new Algorith(N);
            WriteLine($"N = {N,2} -> ZN = {alg.ZN}, SN = {alg.SN}");

            InversAlgorith inv_alg = new InversAlgorith(alg.ZN, alg.SN);
            WriteLine($"ZN = {alg.ZN}, SN = {alg.SN} -> N = {inv_alg.N}");

            WriteLine("press any key (exit ESC)");
            bo_exit = ReadKey(true).Key == ConsoleKey.Escape;
        }
    }

    class Algorith    {
        public uint ZN, SN;
        public Algorith(uint N) {
            uint s = 0, value = 1;
            while (value <= N)
                value += s++;
            this.ZN = N - value + s - 1;
            this.SN = s - 2 - this.ZN;
        }
    }

    class InversAlgorith    {
        public uint N;
        public InversAlgorith(uint ZN, uint SN) {
            uint s = 0, value = 1;
            while(s <= SN + ZN)
                value += s++;
            this.N = value + ZN;
        }
    }

    static string give_1_numbers(uint bis)    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        sb.AppendLine("numbers of diagonal elements");
        for (uint i = 0; i < bis; i++)        {
            if (i > 0 && i % 10 == 0)
                sb.AppendLine();
            InversAlgorith ia = new InversAlgorith(i, i);
            sb.Append($"{ia.N.ToString("n0"), 10}");            
        }
        return sb.ToString();
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben