[Archiv!] Reine Mathematik, Physik, Chemie usw.: Gehirntrainingsprobleme, die in keiner Weise mit dem Handel zusammenhängen - Seite 511

 

MaxZ:

Ich verstehe die Änderungen. Ich habe es nur noch nicht herausgefunden:

   for(int i=5;i>-1;i--)
     {
      XX|=int(1<<A[i]);
     }
   if(XX==0x7E) {return true;}

"|=" ist das logische ODER? Und dann ist es eine Sackgasse...

"|=" ist in diesem Fall ein bitweises "oder". Dieses Ding hebt Bits um XX an Positionen an, die A[i] entsprechen.

Und wenn nach der Schleife alle Bits eins bis sechs 1 sind, bedeutet das, dass alle Ziffern 1 bis 6 genau einmal in der Zahl X vorkommen.

0x7E ist die hexadezimale Darstellung der Binärzahl 1111110. (rechtes Bit ist Null)

 
jartmailru:

Oder vielleicht ist es in C++?
.
Validieren - eine Funktion mit einem einzigen Parameter.
Vielleicht sollten wir es auf die alte Weise machen... Speicher zuweisen und einen bool zwischenspeichern
für alle gültigen Werte des Arguments?

In MQL können Sie einen Auftrag eröffnen, falls sich die Hockeynummern wie durch ein Wunder gleichmäßig aufteilen! :))

Aber im Ernst, ich bin dir definitiv nicht ebenbürtig.


MetaDriver:

In diesem Fall ist "|=" ein bitweises "oder". Dadurch werden die Bits an den Positionen, die A[i] entsprechen, um XX erhöht.

Und wenn nach der Schleife alle Bits eins bis sechs 1 sind, bedeutet das, dass alle Ziffern von 1 bis 6 genau einmal in der Zahl X vorkommen.

0x7E ist die hexadezimale Darstellung der Binärzahl 1111110. (rechtes Bit ist Null)
Das ist es, was mich am meisten stört. Ich danke Ihnen. Ich hab's!
 
jartmailru:

1. wie sieht es mit C++ aus?
.
2. Validieren - Funktion mit einem Parameter.
Vielleicht sollten wir es auf die altmodische Art machen... ...Speicher zuweisen und ein bool zwischenspeichern
für alle gültigen Werte des Arguments?

1. Nun, die Sprache und das Umfeld sind nicht wirklich der Punkt. Der Punkt ist der Algorithmus selbst.

2....Uh...Was ist noch?

 
MaxZ:

Aber 125 ms sind eindeutig nicht aufholbar.

Das sollten Sie nicht tun. Ihr Wert beträgt 47 ms.

Schade, dass Sie keine Lösung haben, es ist schwer, die Ergebnisse zu vergleichen... :)))

.

Aber ich verstehe immer noch nicht, warum wir nach Personen vergleichen müssen.

if(A6!=B6 && A5!=B5 && A4!=B4 && A3!=B3 && A2!=B2 && A1!=B1)

?

Es scheint, dass die Überschneidungen in einer einzigen Position unkritisch sind?

 
MetaDriver:

Das sollten Sie nicht tun. Ihr Wert beträgt 47 ms.

Schade, dass Sie keine Lösung haben, es ist schwer, die Ergebnisse zu vergleichen... :)))

.

Aber ich verstehe immer noch nicht, warum wir nach Personen vergleichen müssen.

if(A6!=B6 && A5!=B5 && A4!=B4 && A3!=B3 && A2!=B2 && A1!=B1)

?

Ich habe den Eindruck, dass Zufälle an einer einzigen Stelle unkritisch sind?

Sieh dir das an! :DDD


Ich habe um Geschwindigkeit gekämpft.

Ich glaube, dass die Bedingung:

if (A6 != B6 && A5 != B5 && A4 != B4 && A3 != B3 && A2 != B2 && A1 != B1)

wird um ein Vielfaches schneller ausgeführt als die folgenden Zeilen:

int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;

Und dieser Zustand wird mehr als einmal ausgelöst. Das ist kein schlechter Geschwindigkeitszuwachs. Auch wenn es vielleicht nicht so wichtig ist. Wir können sie ausbauen und überprüfen. Aber ich bin immer noch der Meinung, dass dieser Zustand sich selbst rechtfertigt.

 
MaxZ:


Ich habe um Geschwindigkeit gekämpft:

Ich glaube, dass die Bedingung:

if (A6 != B6 && A5 != B5 && A4 != B4 && A3 != B3 && A2 != B2 && A1 != B1)

wird um ein Vielfaches schneller laufen als die folgenden Zeilen:

int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;

Und dieser Zustand wird mehr als einmal ausgelöst. Das ist ein schöner Gewinn an Leistung. Obwohl das vielleicht gar nicht so erheblich ist. Sie können sie entfernen und überprüfen. Aber ich bin immer noch der Meinung, dass dieser Zustand sich selbst rechtfertigt.

Dies scheint jedoch nicht korrekt zu sein. Wenn z. B. A4==B4 ist, ist die Bedingung falsch, während die Zahlen unterschiedlich sein können (z. B. 654321 und 124365).
 

korrigiert, so gemacht.

                                    for(int B1=1; B1<=6; B1++)
                                      {
                                       if(B1==B2 || B1==B3 || B1==B4 || B1==B5 || B1==B6) continue;
//                                       if(A6!=B6 && A5!=B5 && A4!=B4 && A3!=B3 && A2!=B2 && A1!=B1)
                                         {
                                          int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
                                          int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;
                                          if (A==B) continue;
                                          if(MathMod(A,B)==0)
                                             Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B);
                                         }
                                      }
                                   }

Gleiche 47 ms.

Also - kein Grund, sich mit dieser Bedingung zu beschäftigen.

 
MetaDriver:

korrigiert, so gemacht.

Gleiche 47 ms.

Machen Sie sich also keine Gedanken über diese Bedingung.

Ich habe mich geirrt... Und ich spreche von Geschwindigkeit! :)) Ich kann nicht klar denken. Es ist schon nach meiner Schlafenszeit. Meine Ortszeit ist 6:00 Uhr morgens...

So machen Sie den Code:

                                    for (int B1=1; B1<=6; B1++)
                                    {
                                       if (B1==B2 || B1==B3 || B1==B4 || B1==B5 || B1==B6) continue;
                                       if (A6==B6 && A5==B5 && A4==B4 && A3==B3 && A2==B2 && A1==B1) continue;
                                       
                                       int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
                                       int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;
                                       if (A < B) continue;
                                       if (MathMod(A,B)==0)
                                           Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B);
                                    }

Das ist zu viel.

                                       if (A==B) continue;
                                       if (MathMod(A,B)==0)

...denn das Skript müsste das Weniger durch das Mehr dividieren...

 

Das ist Scheiße. Wolodja Und damit müssen Sie einfrieren? Da haben wir es - Feuer! Wie oft noch!

Deines ist ein Schwein. Mit freundlichen Grüßen...

 
MaxZ:

So machen Sie es mit dem Code:


Ja, so ist es besser. 31 ms.

Svinozavr 22.08.2011 01:58

Das ist Scheiße. Wolodja Und das ist zum Einfrieren? Bitte sehr - hören Sie auf! Wie viel Sie können!

Deines ist Schwein. Mit freundlichen Grüßen...

Kapriolen des Künstlers.... :)

Kaufmännische Beweggründe werden in einer Woche langweilig. Manchmal kann man aus Liebe zur Kunst aussteigen. ;)

Grund der Beschwerde: