WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zahlenkombination mit for Schleifen ermitteln

 

"MatLabexperte&quo

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2010, 23:01     Titel: Zahlenkombination mit for Schleifen ermitteln
  Antworten mit Zitat      
Hi Leute,
ich bin am verzweifeln. Tüftel schon mehrere Abende und verliere langsam aber sicher die Lust. Kann mir bitte jemand sagen, warum ich folgendes "Problem" nicht lösen kann?

Aufgabe:

Ein finanziell anspruchsvoller Student braucht dringend Geld und schreibt seinem Vater ein E-Mail mit dem Text ”send more money“. Sein Vater gibt ihm mehr Geld, wenn er die Rechenaufgabe
s e n d
+ m o r e
m o n e y
lösen kann. Jedem Buchstaben muss eine andere Ziffer entsprechen und die Summe muss stimmen. Helfen Sie dem verarmten Studenten und schreiben Sie ihm ein Matlab-Skript.

Mein Lösungsversuch ist folgender:

Code:

a = [0 0 0 0];                                      %"send"
b = [1 0 0 0];                                      %"more", wobei m 1 sein muss
c = [0 0 0 0];                                      %"money", wobei die 1 für das m gleich weggelassen wird

   for ca=0 : +1 : 9,                               %Alle nötigen c - Kombinationen Anfang
       c(1) = ca;
       b(2) = c(1);
       for cd=0 : +1 : 9,
           c(4) = cd;                               %Alle nötigen c - Kombinationen Ende
           for bc=0 : +1 : 9,                       %Alle nötigen b - Kombinationen Anfang
               b(3) = bc;                           %Alle nötigen b - Kombinationen Ende
               for aa=0 : +1 : 9,                   %Alle nötigen a - Kombinationen Anfang
                   a(1) = aa;
                   for ab=0 : +1 : 9,
                       a(2) = ab;
                       b(4) = a(2);
                       c(3) = a(2);
                       for ac=0 : +1 : 9,
                           a(3) = ac;
                           c(2) = a(3);
                           for ad=0 : +1 : 9,
                               a(4) = ad;
                               d = a + b;           %Alle a - Kombinationen Ende
                               if isequal(d,c)
                                   a
                                   b
                                   c
                                   break;
                               end
                           end
                       end
                   end
               end
           end
       end
   end


Vielen Dank für eure Hilfe!


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.06.2010, 01:00     Titel:
  Antworten mit Zitat      
Hallo

1) mach es dir doch etwas einfacher , verwende als Laufindizien die Buchstabennamen.
2) Die Ziffern für bestimmte Buchstaben müssen unterschiedlich sein,
sonst kriegst du viele Lösungen
3) Überträge muss du auch berücksichtigen

4)
Code:

d = a + b;           %Alle a - Kombinationen Ende
if isequal(d,c)
end
 

Die Bedingung kann doch so nie stimmen, da hast du die Aufgabe noch nicht verstanden, da kriegst doch etwas zufällig generiertes, aber der Aufgabestellung nicht entsprechend




Code:

m = 1;

for s = setxor(0 : 9, m)                              
   for e = setxor(0 : 9, [m s])
      for n = setxor(0 : 9, [m s e])                        
         for d = setxor(0 : 9, [m s e n])                  
            for o = setxor(0 : 9, [m s e n d])
               for r = setxor(0 : 9, [m s e n d o])
                  y  = mod(d+e,10);
                  if s+m+floor((e+o)/10)>=10        &&...
                        mod(s+m+floor((e+o)/10),10)==o &&...
                        mod(e+o+floor((n+r)/10),10)==n &&...
                        mod(n+r+floor((d+e)/10),10)==e && ...
                        all(y~=[m o n e])
                     a = [s e n d];
                     b = [ m o r e];
                     c = [ m o n e y ];
                     break;
                  end
               end
            end
         end
      end
   end
end

fprintf(' %d%d%d%d\n',a);
fprintf('+%d%d%d%d\n',b);
fprintf('---------\n');
fprintf('%d%d%d%d%d\n',c);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabexperte

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2010, 22:12     Titel:
  Antworten mit Zitat      
Puh, danke für die schnelle Antwort!
Echt cooles Programm! Aber mit den Funktionen steig ich noch nicht so ganz durch... Werds mir morgen nochmal in Ruhe anschauen. Hattest du den Code schon oder hast du den einfach so auf die schnelle hingezaubert? Echt super! Hut ab! Kannst du mir vielleicht genauer sagen, wo mein Denkfehler im Grundverständnis der Aufgabe liegt? Komm nicht drauf, was du genau meinst. Danke!
 
"MatLapexperte&quo

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2010, 00:10     Titel:
  Antworten mit Zitat      
Sorry, mit den Funktionen, des scheint mir sehr kompliziert, wenn man sie nicht kennt. Das ganze muss doch einfacher zu lösen sein? Hab folgendes ausprobiert. Gibt aber gar nichts aus. Denke ich habe die Aufgabe jetzt richtig verstanden und das Programm folgendermaßen angepasst:
Code:

m = 1;

for s=0 : +1 : 9,
    for e=0 : +1 : 9,
        for n=0 : +1 : 9,
            for d=0 : +1 : 9,
                for o=0 : +1 : 9,
                    for r=0 : +1 : 9,                            
                        y = d + e;
                        if y > 10
                            y = y - 10;                            
                            if e ~= (n + r + 1)
                            break;
                            end
                        else
                        if e ~= (n + r)
                            break;
                        end
                        end
                        if (e + o) ~= n
                            break;
                        end
                        if (s + m) == o
                            a = [s e n d];
                            b = [m o r e];
                            c = [m o n e y];
                            fprintf(' %d%d%d%d\n',a);
                            fprintf('+%d%d%d%d\n',b);
                            fprintf('---------\n');
                            fprintf('%d%d%d%d%d\n',c);
                            break;
                        end                          
                    end
                end
            end
        end
    end
end

Hat jemand nen Tip, warums nicht klappt?
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 11.06.2010, 00:41     Titel:
  Antworten mit Zitat      
Hallo
Also deine Bedingung stimmt noch nicht, schreib dir auf Papier was
du alles berücksichtigen muss. Dann wird es einfacher zu implementieren
1) z.B (s + m) == o , was wenn Summe ergibt 10 ==> 10 ist ungleich 0
du muss bedenken dass du nicht Zahlen vergleichst sondern Ziffern und Ziffern sind zw. 0 und 9 also muss du was machen? Richtig Modulo

2) wenn summe ergibt 10 was muss du noch machen, du muss Übertrag berücksichtigen auf nächste Ziffer
Code:

% diese 2 Bedienungen  sind in diesem Ausdruck versteckt
 mod(s+m+floor((e+o)/10),10) == o
 


ich habe schon 4 Versionen der Programms geschrieben

hier die Schnellste Version: Smile
Code:

% alle Kombinationen ohne Zurücklegen
% der Ziffern 0 2 3 4 5 6 7 8 9
comb = perms([0,2:9]);

% nimm Kombination Spalten
s   = comb(:,1);
e   = comb(:,2);
n   = comb(:,3);
d   = comb(:,4);
m   = 1;
o   = comb(:,5);
r   = comb(:,6);
y   = mod(d+e,10);

% addiere zusammen und vergleiche
pos =   s+m+floor((e+o)/10)         >= 10 &...
         mod(s+m+floor((e+o)/10),10) == o &...
         mod(e+o+floor((n+r)/10),10) == n &...
         mod(n+r+floor((d+e)/10),10) == e & ...
         y~= m & y~=o & y~=n & y~=e;
 
% die Position ausgeben

s = unique(s(pos));
e = unique(e(pos));
n = unique(n(pos));
d = unique(d(pos));
o = unique(o(pos));
r = unique(r(pos));
y = unique(y(pos));



fprintf(' %d%d%d%d\n',s,e,n,d);
fprintf('+%d%d%d%d\n',m,o,r,e);
fprintf('---------\n');
fprintf('%d%d%d%d%d\n',m,o,n,e,y);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabexperte

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2010, 15:24     Titel:
  Antworten mit Zitat      
Danke für deine Hilfe! Habs jetzt rausbekommen. Schau mal hier vielleicht noch ne Lösung für deine Sammlung:
Code:

m = 1;
tic;
for s=0 : +1 : 9,
    for e=0 : +1 : 9,
        for n=0 : +1 : 9,
            for d=0 : +1 : 9,
                send = 1000*s + 100*e + 10*n + d;
                for o=0 : +1 : 9,
                    for r=0 : +1 : 9,  
                        more = 1000*m + 100*o + 10*r + e;
                        for y=0 : +1 : 9,
                            money = 10000*m + 1000*o + 100*n + 10*e + y;
                        if(send+more==money)
                            if(min(diff(sort([s,e,n,d,m,o,r,y])))>0);
                            fprintf(' %d\n',send);
                            fprintf('+%d\n',more);
                            fprintf('---------\n');
                            fprintf('%d\n',money);
                            return;
                            end
                        end
                        end                          
                    end
                end
            end
        end
    end
end
Rechenzeit = toc
 
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.