Benutzerdefinierte Suche

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

  1. Kryptaesthesie

    Kryptaesthesie Thread StarterMacUser Mitglied

    Mitglied seit:
    17.05.2004
    Beiträge:
    575
    Zustimmungen:
    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
     
    Kryptaesthesie, 08.02.2007
  2. richej

    richejMacUser Mitglied

    Mitglied seit:
    26.10.2005
    Beiträge:
    74
    Zustimmungen:
    3
    Hmm... gibt es überhaupt eine Lösung? Evtl. kann er keine Zahl finden, weils keine gibt...
     
    richej, 08.02.2007
  3. below

    belowMacUser Mitglied

    Mitglied seit:
    15.03.2004
    Beiträge:
    13.289
    Zustimmungen:
    1.086
    Sind doch nur 10000 Zahlen. Brute Force, sage ich!

    Alex
     
    below, 08.02.2007
  4. was dagegen ?

    was dagegen ?MacUser Mitglied

    Mitglied seit:
    17.11.2006
    Beiträge:
    323
    Zustimmungen:
    7
    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 =))
     
    was dagegen ?, 08.02.2007
  5. HäckMäc_2

    HäckMäc_2MacUser Mitglied

    Mitglied seit:
    26.04.2005
    Beiträge:
    4.208
    Zustimmungen:
    288
    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.
     
    HäckMäc_2, 08.02.2007
  6. below

    belowMacUser Mitglied

    Mitglied seit:
    15.03.2004
    Beiträge:
    13.289
    Zustimmungen:
    1.086
    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
     
    below, 08.02.2007
  7. richej

    richejMacUser Mitglied

    Mitglied seit:
    26.10.2005
    Beiträge:
    74
    Zustimmungen:
    3
    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, 08.02.2007
  8. below

    belowMacUser Mitglied

    Mitglied seit:
    15.03.2004
    Beiträge:
    13.289
    Zustimmungen:
    1.086
    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
     
    below, 08.02.2007
  9. Kryptaesthesie

    Kryptaesthesie Thread StarterMacUser Mitglied

    Mitglied seit:
    17.05.2004
    Beiträge:
    575
    Zustimmungen:
    6
    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
     
    Kryptaesthesie, 08.02.2007
  10. richej

    richejMacUser Mitglied

    Mitglied seit:
    26.10.2005
    Beiträge:
    74
    Zustimmungen:
    3
    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
     
    richej, 08.02.2007
Die Seite wird geladen...
Ähnliche Themen - ABCD=A^B*C^D vom Programm
  1. Wolfseye
    Antworten:
    16
    Aufrufe:
    352
  2. GeFa
    Antworten:
    9
    Aufrufe:
    604
    Gondomir
    15.08.2016
  3. Saloice
    Antworten:
    4
    Aufrufe:
    578
  4. ZoliTeglas
    Antworten:
    5
    Aufrufe:
    384
    mrthomasd
    13.10.2015
  5. Stelios4
    Antworten:
    11
    Aufrufe:
    1.199
    little_pixel
    27.11.2014