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
