ABCD=A^B*C^D vom Programm lösen lassen...?!

Kryptaesthesie

Kryptaesthesie

Aktives Mitglied
Thread Starter
Dabei seit
17.05.2004
Beiträge
576
Reaktionspunkte
6
Hallo.
Ich habe hier eine Gleichung und möchte die gerne lösen:


Gibt es eine vierstellige Zahl, für die folgendes gild?

ABCD=A^B*C^D

A, B, C und D sind nicht notwendigerweise verschieden!


Bei meinem Entwurf komme ich leider nicht zu einem Ergebnis:
Code:
public class Loesen {

  
  private static long getTausender(long zahl) {
    return (zahl / 1000);
  }
  
  private static long getHunderter(long zahl) {
    return (zahl - (getTausender(zahl) * 1000)) / 100;
  }
  
  private static long getZehner(long zahl) {
    zahl -= getTausender(zahl) * 1000;
    zahl -= getHunderter(zahl) * 100;
    return (zahl / 10);
  }
  
  private static long getEiner(long zahl) {
    zahl -= getTausender(zahl) * 1000;
    zahl -= getHunderter(zahl) * 100;
    zahl -= getZehner(zahl) * 10;
    return (zahl);
  }
  
  public static void main(String[] args) {
    long zahl = 999;
    long rechts;
    
    if(zahl == 999) {
      do {
        zahl++;
        rechts = (getTausender(zahl)^getHunderter(zahl)) * (getZehner(zahl)^getEiner(zahl));
      } while(zahl != rechts && zahl < 10000);
      System.out.println("Gleichung: " + zahl + " = " + rechts);
    } else { System.out.println("Ungueltige Zahl!"); }
  }

}

Das Programm macht immer die 10000 Durchläufe.
Stehe auf dem Schlauch, weiß nicht, wie ich weiter machen muss...?!


MfG Gerrit
 
Hmm... gibt es überhaupt eine Lösung? Evtl. kann er keine Zahl finden, weils keine gibt...
 
Sind doch nur 10000 Zahlen. Brute Force, sage ich!

Alex
 
ich würde einfach jedes mal die Gleichung ausgeben lassen (oder in eine Datei schreiben) und dann mal per Hand reinschauen - dann siehst du ganz fix, falls an der Rechnung was nicht stimmt (weil er z.B. Blödsinn ausgibt) oder du kannst mal gucken, ob du das Ergebnis selber findest (sind j nur 8999 Gleichungen, da kann man mal drüber scrollen =))
 
Mir fällt auf Anhieb nur eine Lösung ein, die aber immer alle Kombinationen prüft (erschöpfendes Durchsuchen):
Code:
Loesung := 0;
Links := 0;
Rechts := 0;
for A := 0 to 9 do begin
  for B := 0 to 9 do begin
    for C := 0 to 9 do begin
      for D := 0 to 9 do begin
        Rechts := A^B * C^D;
        Links := A*1000+B*100+C*10+D;
        if Rechts = Links then begin
          Loesung := Loesung+1;
          LA[Loesung] := A;
          LB[Loesung] := B;
          LC[Loesung] := C;
          LD[Loesung] := D;
        end;  {vom if}
      end;    {von Schleife A}
    end;      {von Schleife B}
  end;        {von Schleife C}
end;          {von Schleife D}
Die Anzahl der Lösungen steht in "Loesung" und die einzelnen Lösungen stehen in den Arrays LA bis LD.
 
Oder (bischen schlampiger)
Code:
#include <stdio.h>
#include <math.h>

int main (int argc, const char * argv[]) {
	int i;
	unsigned char abcd[5];
	
	for (i=0; i <= 10000; i++)
	{
		double a, b, c, d;
		int result;
		
		snprintf((char*)abcd,5,"%04d", i);
		a = abcd[0]-'0';
		b = abcd[1]-'0';
		c = abcd[2]-'0';
		d = abcd[3]-'0';
		
		result = pow (a, b) * pow (c, d);
		if (result == i)
			printf ("abcd = a^b*c^d gilt fuer %04d\n", i);
	}
	
    return 0;
}

Alex
 
2592 ist das Ergebnis ;) .. du wolltest wahrscheinlich die Potenz von A^B bilden, da musst du Math.pow() verwenden..

Meine Lösung:
for(int i=1000;i<10000;i++)
{
string val = i.ToString();
int a = Convert.ToInt32(val[0].ToString());
int b = Convert.ToInt32(val[1].ToString());
int c = Convert.ToInt32(val[2].ToString());
int d = Convert.ToInt32(val[3].ToString());
int result = (int)(Math.Pow(a,b)*Math.Pow(c,d));

if(i==result)
Console.WriteLine("A:"+a+" B:"+b+" C:"+c+" D:"+d+" Result: "+result);

}
 
richej schrieb:
2592 ist das Ergebnis ;) .. du wolltest wahrscheinlich die Potenz von A^B bilden, da musst du Math.pow() verwenden..

Verrat doch nicht alles ;)

Aber daran sieht man mal den Fluch moderner Rechner. Früher hätte man da noch richtig drüber nachdenken müssen, heute macht das sogar mein iMac in wenigen Augenblicken.

Das Problem lässt sich ja sogar 1A parallesieren, da könnte man das auf dem Mac Pro auf vier Cores laufen lassen. Und dann ist nicht mehr mit Nachdenken, sondern einfach nur stupides Rechnen lassen :D

Alex
 
richej schrieb:
2592 ist das Ergebnis ;) .. du wolltest wahrscheinlich die Potenz von A^B bilden, da musst du Math.pow() verwenden..
ach, musstest du's verraten?? :)

Aber wunderbar, Math.pow(), das war es, was mir gefehlt hat. Mehr brauchte ich gar nicht ändern.

Ach ja, zu den ersten 286ern soll das noch viele viele Stunden gedauert haben, bis das Ergebnis raus kam... :)


Also, danke euch allen :)
MfG Gerrit
 
Hab gerade mal versucht zu messen wie lange es dauert, aber es scheint zu kurz zum messen zu sein ;) jedenfalls kam immer 0ms raus :D
 
kleiner tipp:
für solche aufgaben wurden deklarative programmiersprachen gemacht :D
(z.b. prolog)
 
qfat schrieb:
kleiner tipp:
für solche aufgaben wurden deklarative programmiersprachen gemacht :D
(z.b. prolog)

Daran dachte ich bei meinem Post oben: Es ist schon schade, dass mit den heutigen Rechnern Brute Force Methoden schneller zum Ergebnis führen als schöne Methoden, z.B. in Prolog.

Ich habe mal ein bischen Gesichtererkennung gemacht, und der Trend geht da auch ganz klar einfach zum ganz dummen Rechnen mit ganz schnellen Rechnern.

:(

Alex
 
meine Prolog Zeit liegt schon 'ne ganze Weile zurück, deswegen will mir vermutlich grad keine Idee kommen - aber micht interessiert's doch sehr =)
könntet ihr mir 'ne Prolog Lösung zeigen, die nicht ~9000 Iterationen braucht (ich hab echt zu lange kein Prolog mehr angeguckt)

und wenn ich schon dabei bin, überleg ich mir auch noch was in Scheme, das hab ich direkt nach Prolog gelernt :D
 
Zurück
Oben Unten