Laden...

Effizienter kombinatorischer Algorithmus

Erstellt von Omega vor 2 Jahren Letzter Beitrag vor 2 Jahren 212 Views
Omega Themenstarter:in
5 Beiträge seit 2021
vor 2 Jahren
Effizienter kombinatorischer Algorithmus

Hallo Community

Da ich noch eher Neuling im Bereich C# bin, sind mir komplexere Schleifen noch etwas fremd. Daher erlaube ich mir folgende Frage: Wie muss eine Schleife aussehen, wenn ich ermitteln will, aus welcher Kombination (x1 * x2) eine bekannte Zahl besteht.

Es gibt also eine Grosse, bekannte Zahl, die aus 2 kleineren multipliziert wurde. Nun gibt es 20 mögliche Multiplikatoren. Ich möchte demnach herausfinden, aus welchen 2 Zahlen der 20 Möglichkeiten diese nun besteht. aus 20 möglichen Multiplikatoren gibt es (n + m - 1)! / ((n - 1)! * m!) = 210 Kombinationsmöglichkeiten, sofern ich das richtig berechnet habe. Es sollten alle Kombinationen die zu dieser Zahl führen ausgegeben werden.

Sehr vereinfacht und nur mit 2 Kombinationen (aber natürlich noch nicht brauchbar) dargestellt, würde das etwa so aussehen.


long a = 1;
long b = 2;
long c = 3;
long d = 4;
long e = 5;
long f = 6;
long g = 7;
long h = 8;
long j = 9;
long k = 10;
long l = 11;
long n = 12;
long m = 13;
long o = 14;
long p = 15;
long q = 16;
long r = 17;
long s = 18;
long t = 19;
long u = 20;

private void btnAnalyce_Click(object sender, EventArgs e)
{
    uint Zahl = (8);

    while (true)
    {
        if (Zahl == (b * c))
        {
             MessageBox.Show("ja, = b * c");
             break;
        }
        else if (Zahl == (b * d))
        {
            MessageBox.Show("ja, = b * d");
            break;
        }
        else
        {
            MessageBox.Show("nein");
            break;
        }
    } 
}

Wäre toll wenn da jemand ist, der dafür eine elegante Lösung hat. Später sind das sehr grosse Zahlen, daher auch long und uint.

3.825 Beiträge seit 2006
vor 2 Jahren

Eleganter wäre es die Zahlen in einem Array oder in einer List<> zu speichern.


long[] numbers = new long[] { 1,2,3,4,5,6,7,8,9,10 };

for(int i = 0; i < numbers.Length; i++)
    for(int j = 0; j < numbers.Length; j++)
        if (zahl == numbers[i] * numbers[j]) MessageBox.Show(numbers[i].ToString() + " x " + numbers[j].ToString());

Möchtest Du eine Verschlüsselung mit private key knacken ?

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

Omega Themenstarter:in
5 Beiträge seit 2021
vor 2 Jahren

Hallo Bernd,

Vielen Dank, das funktioniert bereits recht gut. N = (p * q) wäre ein Argument. Primär geht es mir aber um eine andere Aufgabe. Aber ja, es handelt sich schon um (grosse) Primzahlen. Demnach müsste ich wahrscheinlich noch -1 einbauen ?

Grüsse
Omega