Frage von nick9970, 38

Kann mir jemand bei der Korrektur meines Programms behilflich sein, welches den kgV berechnen soll?

#include <stdio.h>
main() 
{ 
  printf("\tkgV-Rechner\n");
  int a, b, erga, ergb;
  printf("Zahl a:");
  scanf_s("%i", &a);
  printf("Zahl b:");
  scanf_s("%i", &b);
  erga = a;
  ergb = b;

  while (erga != ergb) 
  {
    if (erga == ergb)
    {
        printf("%i\n", erga);
        break;
    }
    else
        erga=erga+a;
    if (erga == ergb)
    {
        printf("%i\n", erga);
        break;
    }
    else ergb=ergb+b;
    if (erga == ergb)
    {
        printf("%i\n", erga);
        break;
    }
  }
} 

Das Programm kriegt seine Zahlen eingegeben und soll halt den kgV produzieren. 

Für kleinere Paare wie 1, 2 oder 4, 5 funktioniert es super, aber für größere Paare kommen riesige und vor allem falsche Zahlen heraus. 

Hat einer eine Idee, wo das Problem sein könnte?

Antwort
von Suboptimierer, 15

In das erste 

if (erga == ergb)


geht er nie rein. Das mal so generell (auch wenn es wahrscheinlich nicht dein Problem ist, wessen Lösung du suchst).

Den kleineren Zwischenwert würde ich immer um den Ausgangswert erhöhen (siehe Antwort von MidnightLuna). Aber ob das Ergebnis optimal, also das kleinstmögliche Vielfache sein wird, müsste man dann sehen.

Kommentar von nick9970 ,

warum sollte er da nicht reingehen?

Kommentar von Suboptimierer ,

Die Schleifenbedingung, die direkt darüber liegt, schließt Gleichheit aus.

Du fragst sozusagen erst ab, ob sie die Werte ungleich sind und wenn sie ungleich sind, fragst du, ob sie gleich sind.

Antwort
von MidnightLuna, 11

Das Programm testet ja im Grunde erst ob beide Zahlen gleich sind (erga ; ergb)

Dann nimmter er die erste Zahl und addiertz sie zu der ersten ausganszahl. Wenn sie jetzt nicht gleich sind, dann macht er es nochmal mit der anderen Zahl.

Z.b. mit 20 und 30

------------------------

ist 20 = 30? Nein -> 20+20

ist 40 = 30?  Nein -> 30+30

ist 40 = 60? Nein -> (schleife wiederholt sich)

ist 40 = 60? Nein -> 40 + 20

ist 60 = 60? Ja -> Print

------------------------------

Das funktioniert also.

Jetzt machen wir das aber mal andersherum.

ist 30 = 20? Nein -> 30+30

ist 60 = 20?  Nein -> 20+20

ist 60 = 40? Nein -> (schleife wiederholt sich)

ist 60 = 40? Nein -> 60 + 30

ist 90 = 40? Nein -> 40+20

ist 90 = 60? Nein -> (Schleife wiederholt sich)

ist 90 = 60? Nein -> 90+30

ist 120 = 60? Nein -> 60+20

ist 120 = 80? Nein -> (Schleife wiederholt sich)

Das ist also schon mal der erste Fehler, d.h. das Programm muss nach größe der Zahl sortieren, so dass die kleinere Zahl zuerst kommt.

Der zweite Denkfehler liegt in der allgemeinen Berechnung des KgV, den man normalerweise mit der Primfaktorzerlegung errechnet.

Was man auch machen könnte wäre es anders abzufragen.

Zum beispiel in dem du den kleineren Wert immer nur vergrölßerst und überprüfst ob der 2. wert durch den von der keleineren Zahl teilbar ist

Zum Beispiel so ( Wieder mit 20 und 30)(Da is auch egalk welcher Wert der größere ist merk ich gerade)

Ist 20/30 = eine ganze Zahl? Nein -> 20+20

Ist 40/30 = eine ganze Zahl? Nein -> (Schleife wiederholt sich)

Ist 40/30 = eine ganze Zahl? Nein -> 40+20

Ist 60/30 =eine ganze Zahl? Ja -> 60 Ausgeben.

Kommentar von nick9970 ,

Danke..kurz nach dem Post hab ich erkannt weshalb es nicht funktioniert, da sich bei anderen Paaren die Vielfachen überholen ohne das das Programm es merkt

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten