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

#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ß!
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

von hollst (13980 Punkte)
- 19.09.2018 um 13:28 Uhr

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
Seite 1 von 0
1