Übung für Gelangweilte
Übersicht

![]() |
ozzi789Betreff: Übung für Gelangweilte |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schreibt einen Code welcher alle Zahlen zwischen 0 und 9,999,999 findet welche
den gleichen Wert haben wie die Quersumme * Querprodukt Beispiel: 135 = (1+3+5) (1·3·5) Meine Lösung (noch nicht optimiert..) Braucht mit B3D auf einer 2.4 GHZ CPU 79 Sekunden Code: [AUSKLAPPEN] Const max=9999999
maxlenstr$=max maxlen=Len(maxlenstr$) startingtime=MilliSecs() For mainloop=0 To max val=0 valm=1 For innerloop=1 To maxlen temp$=mainloop temp$=Mid(temp$,innerloop,1) val=val+Int(temp$) valm=valm*Int(temp$) If valm>0 Then totvalm=valm Next If mainloop=val*totvalm Print "found ! "+mainloop EndIf Next finishingtime=MilliSecs() Print "It took me: "+(finishingtime-startingtime)/1000+" seconds" Input Grüsse, ozzi |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
- Zuletzt bearbeitet von ozzi789 am Mi, Feb 22, 2012 15:07, insgesamt einmal bearbeitet
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Juhu, Langeweile! ![]() Habs mal anders probiert: BlitzBasic: [AUSKLAPPEN] Const max=9999999 Auf meinem PC braucht dein Code 60sek, meiner 19 ![]() Einziger Schönheitsfehler an meiner Lösung: Die "do"-Variable erscheint mir überflüssig, aber ohne hab ichs nicht geschafft... da fehlts noch an der letzten "mathematischen Raffinesse" ![]() mfG, Christoph. EDIT: Stimmt das wirklich dass es nur 135 und 144 gibt? |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Print funktioniert immer oO
Lösung: 0 , 1 , 135 , 144 Quelle: http://mathworld.wolfram.com/S...umber.html 0 fehlt bei dir als Lösung ![]() Edit: Meine Aufgabenstellung ist falsch... angepasst ![]() Was ist das mit dem power_of_10 ? Check das nicht ganz ![]() Edit2: Eine Variabelnzuweisung aus dem Loop nehmen = 10 Sekunden schneller ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok dann is die Lösung wenigstens richtig ![]() ![]() Und da du schon der zweite bist der meine Lösung nicht kapiert hier eine kleine Erklärung: nehmen wir die Zahl 1234 als Beispiel. Du arbeitest mit Stringfunktionen um die erste, zweite,... Stelle heraus zu nehmen. Ich wollte probieren ob es nicht schneller wäre, die einzelnen Stellen zu "errechnen". Dazu muss man nicht zaubern. Man muss doch eigentlich nur rechnen: 1234 / 1000 = 1 Soweit, so gut. Oweh, ich hab das gar nicht genau untersucht wie BB das macht... ![]() ![]() Zweite Stelle ist trickreich aber auch irgendwie logisch: 1234 - (1 * 1000) / 100 = 234 / 100 = 2 und so gehts dann weiter: 234 - (2 * 100) / 10 = 34 / 10 = 3 und letztendlich 34 - (3 * 10) / 1 = 4 Ich hoffe das Schema ist ersichtlich.Und die 1000, 100, 10 (und alle anderen Potenzen von 10) stecken in "power_of_10". mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
- Zuletzt bearbeitet von Eingeproggt am Mi, Feb 22, 2012 16:21, insgesamt einmal bearbeitet
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah, jetzt hats klick gemacht !
Coole Lösung ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
SpionAtomBetreff: Ziffern aus Zahl extrahieren |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ziffern rechnerisch aus einer Zahl zu extrahieren is easy:
BlitzBasic: [AUSKLAPPEN] ;Ziffern aus Zahl extrahieren |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn man es mal irgendwo aufgeschnappt hat vlt, ich zumindest bin jetzt nicht einfach so draufgekommen, bin auch nicht der hellste was Zahlen angeht ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde es so machen
BlitzMax: [AUSKLAPPEN] Function Quersumme:Int(x:Int) Jetzt hab ich es aber mit BMax gemacht, eventuell ist das deutlich schneller als BB, es braucht bei mir 212 Millisekunden EDIT: Oh ich hab mir die lösungen erst nachher angesehen, ist natürlich genau der selbe ansatz wie von Spion, da war wer schneller ^.^ |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
SpionAtomBetreff: Komplett |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann hier auch nochmal meine vollständige Lösung:
BlitzBasic: [AUSKLAPPEN] Const max=9999999 Quersumme und Querprodukt kann man in derselben Schleife berechnen. Außerdem ist ein notwendiges Kriterium, dass die einzelnen Ziffern die Zahl teilen, diese Überprüfung gibt auch noch nen kleinen Schub. ~563ms |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic: [AUSKLAPPEN] Const NUM_DIGITS = 7 ozzi789: 54000 ms Ana: 154 ms (mit B3D) SpionAtom: 738 ms Vertex: 676 ms |
||
vertex.dreamfall.at | GitHub |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Möglicherweise liegts daran, dass Ana eine 9 vergessen hat ![]() Erklär mal deine Vorgehensweise, Vertex! |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Idee ist, allle Ziffern in einem Array zu halten, um schneller deren Summe und Produkt zu bilden.
Inkrementieren von zahl: Das Array zahl ist ein 7-elementiges Array, wobei das i-te Element die i-te Ziffer in der Zahl darstellt. Also zahl_0 * 10^6 + zahl_1 * 10^5 + ... + zahl_6 * 10^0. Die Addition mit Eins in dem Array kann man sich an dieser Folge verdeutlichen: Code: [AUSKLAPPEN] 00179497
00179498 00179499 00179500 Zu einem Übertrag kann es nur kommen, wenn die letzte Ziffer, also zahl_6, = 9 ist und dann Eins dazu addiert wird. Dann wird der Übertrag an zahl_5 weitergegeben. War zahl_5 zuvor = 9, dann muss ein neuer Übertrag an zahl_4 weitergegeben werden usw. |
||
vertex.dreamfall.at | GitHub |
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erstmal: Danke, ozzi, für dein "Quiz" ![]() Nun zu meiner Lösung mit einem sehr schnellen und umgekehrten Ansatz: Warum Millionen von Zahlen durchgehen, die mindestens eine Null als Ziffer besitzen und von vorneherein ausgeschlossen sind (bis auf die triviale Lösung 0)? Warum aufwendig und wiederholt Quersumme und Querprodukt neu berechnen, wenn man umgekehrt aus Kombinationen der Ziffern 1 bis 9 alle relevanten Zahlen bilden und dabei schon im vorhinein Teile der Quersumme und des Querprodukts vorausberechnen und Strings, Potenzen etc. vermeiden kann: BlitzMax: [AUSKLAPPEN] SuperStrict ... braucht auf meinem alten Rechner 37 ms, und bei euch? ![]() |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzMoritz, sehr gut! Braucht nur 43 ms bei mir. Ein paar ms könnte man da sicher noch herausholen, wenn man die Endrekursion in eine Iteration umformt. | ||
vertex.dreamfall.at | GitHub |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group