C# :: Aufgabe #227 :: Lösung #5

6 Lösungen Lösungen öffentlich
#227

Durchnummerierung aller möglichen geordneten Ziehungsergebnisse bei 6 aus 49

Anfänger - C# von hollst - 06.09.2018 um 10:28 Uhr
Beim Lotto 6 aus 49 gibt es bekanntlich 13.983.816 mögliche (geordnete) Ziehungsergebnisse (49 über 6).

Schreibe ein Programm, das jeder dieser Möglichkeiten eine natürliche Zahl zuordnet, also

1 2 3 4 5 6 -> 1
1 2 3 4 5 7 -> 2

...
...

44 45 46 47 48 49 -> 13.983.816

Viel Spaß!
#5
vote_ok
von hollst (13980 Punkte) - 19.09.2018 um 13:28 Uhr
Quellcode ausblenden C#-Code
using System;
using static System.Console;
using System.Collections.Generic;
using System.Text;

namespace aufgabe_227__6_aus_49
{
    class Program
    {
        static void Main()
        {
            string NL = Environment.NewLine;
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();

            sw.Start();
            List<byte[]> alle_moeglichen_ziehungen = tools.Enum_NueberM(49, 6);
            sw.Stop();

            WriteLine("rechenzeit: " + sw.Elapsed.Dauer() + NL);

            WriteLine(alle_moeglichen_ziehungen[0].ToMyString());
            WriteLine(alle_moeglichen_ziehungen[1].ToMyString());
            WriteLine(NL + "------------------" + NL);
            WriteLine(alle_moeglichen_ziehungen[alle_moeglichen_ziehungen.Count - 1 - 1].ToMyString());
            WriteLine(alle_moeglichen_ziehungen[alle_moeglichen_ziehungen.Count - 1 - 0].ToMyString());

            ReadKey();
        }
    }

    public static class tools
    {
        public static System.Numerics.BigInteger NueberM(int n, int m)
        {
            System.Numerics.BigInteger result = 1;
            for (var i = 0; i < m; i++)
                result *= n--;
            for (var i = 1; i <= m; i++)
                result /= i;
            return result;
        }

        public static List<byte[]> Enum_NueberM(int n, int m)// 6 aus 49 -> (49, 6)
        {
            List<byte[]> result = new List<byte[]>();
            System.Numerics.BigInteger max_loop = NueberM(n, m);

            byte[] b = new byte[m], bmax = new byte[m];

            for (var i = 0; i < b.Length; i++)
            {
                b[i] = (byte)(i + 1);
                bmax[bmax.Length - 1 - i] = (byte)(n - i);
            }

            for (var i = 0; i < max_loop - 1; i++)
            {
                byte[] bb = new byte[b.Length];
                b.CopyTo(bb, 0);
                result.Add(bb);

                int counter = 0;
                for (var j = b.Length - 1; j >= 0; j--)
                    if (b[j] < bmax[j])
                        break;
                    else
                        counter++;

                b[b.Length - 1 - counter]++;
                for (var j = 1; j <= counter; j++)
                    b[b.Length - 1 - counter + j] = (byte)(b[b.Length - 1 - counter] + j);
            }
            result.Add(b);

            return result;
        }

//----------------------------------------------------------------------------------

        public static string ToMyString(this byte[] b)
        {
            StringBuilder sb = new StringBuilder();
            for (var i = 0; i < b.Length; i++)
                sb.Append($"{b[i],3}");
            return sb.ToString();
        }

        public static string Dauer(this TimeSpan ts) =>
            String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
    }
}

Kommentare:

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

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