Der Knobelthread

Diskutiere Der Knobelthread im Smalltalk und Offtopic Forum im Bereich Community; Bin eigentlich nicht dran, aber ich hab’ noch was und damit es weitergeht, drängel ich mal und stelle das hier rein: Nobbe, Achim und Serpel...
Ziegenpeter

Ziegenpeter

Dabei seit
13.04.2019
Beiträge
1.420
Ort
In Baden, wo die Sonne lacht, über die Schwaben :)
Modell
R1250GS
Bin eigentlich nicht dran, aber ich hab’ noch was und damit es weitergeht, drängel ich mal und stelle das hier rein:

Nobbe, Achim und Serpel befinden sich immer noch auf der Muot Selvas. Spät an einem Abend klopft es plötzlich an der Tür. Es ist Willi, der sich durch den Schneesturm gekämpft hat, um an dem Knobelseminar, das Achim und Serpel die folgende Woche dort anbieten, teilzunehmen.

Willi kommt gerade richtig zum Abendessen. Es gibt Plain in Pigna

C0609A17-568A-4482-912E-09CEFDCBD322.jpeg


und Engadiner Nusstorte

73DC3309-FD25-46CF-BB78-EB45640768FC.jpeg


zum Nachtisch, zubereitet nach Serpel‘s Traditionsrezept.

Beim Nachtisch erzählt Willi, dass er letzte Woche eine kleine Summe im Lotto gewonnen hat. Da er plant es sich die nächsten Wochen in der Schweiz gut gehen zu lassen, hat er den ganzen Gewinn in bar in Schweizer Franken bei sich. Auf die Frage, wieviel es denn sei, antwortet er:

Der Gewinn wurde in CHF 1000, 500 und 200 Scheine umgetauscht, die Anzahl der Scheine pro Sorte ist jeweils eine unterschiedliche Primzahl. Die Anzahl der 500er multipliziert mit der Summe aus der Anzahl der 500er und der Anzahl der 200er ist um 120 größer als die Anzahl der 1000‘er.

Nach gefühlt 5 Sekunden hat Serpel die Antwort parat, er wartet jedoch noch etwas um zu sehen, ob sonst noch jemand eine Lösung (mit Lösungsweg <> Raten) parat hat.

Nobbe hat die Aufgabe heimlich gleich im GS Forum (im Knobelthread) gepostet um die Lösung, oder zumindest Hinweise, zu erhalten. Es kann sich also natürlich jeder hier an der Lösungssuche beteiligen.
 
Serpel

Serpel

Dabei seit
17.06.2013
Beiträge
10.396
Ort
Engadin
Modell
BMW K 1300 S, Triumph Street Triple 765 RS
Wenn ich so viele feine Sachen sehe, kann ich nicht mehr denken ...

... die fünf Sekunden sind längst vorbei und ich hab die Lösung immer noch nicht! :cry:

Gruß
Serpel
 
nobbe

nobbe

Dabei seit
13.03.2010
Beiträge
13.713
200 = x
500 = y
1000 = z

y* (y+x) = 120 - z

x y + y^2 + z - 120 = 0


jeweils x,y,z = primzahl
 
Zuletzt bearbeitet:
Serpel

Serpel

Dabei seit
17.06.2013
Beiträge
10.396
Ort
Engadin
Modell
BMW K 1300 S, Triumph Street Triple 765 RS
Hab da eine Zauberzahl: 23112

Weiß aber nicht, ob die stimmt ... :crying:

Gruß
Serpel
 
nobbe

nobbe

Dabei seit
13.03.2010
Beiträge
13.713
Aaaber jetzt den Lösungsweg verständlich für alle bitte :bier:
ja also ( per programm geholt)

...

#include <Math.au3>
#include <String.au3>
#include <Misc.au3>
;
; y (y + x) = z - 120
; x y + y^2 - z + 120 = 0
; als prime zahl

$max = 1000
for $x1 = 1 to $max
for $y1 = 1 to $max
for $z1 = 1 to $max

if ( (_IsPrime($x1) == 1) AND (_IsPrime($y1) == 1) AND (_IsPrime($z1) == 1) ) THEN

; x y + y^2 - z + 120 = 0
if ( ($x1* $y1) + ($y1*$y1) - $z1 + 120 == 0 ) then

ConsoleWrite( "x 200= " & $x1 & @CRLF )
ConsoleWrite( "y 500= " & $y1 & @CRLF )
ConsoleWrite( "z 1000= " & $z1 & @CRLF )

endif
ENDIF
Next
Next
Next

;==

; Function Name: _IsPrime
; Description:: Check if a number is prime or not
; Parameter(s): $i_num - Number to check
; Requirement(s): None
; Return Value(s): 1 - Number is prime
; 0 - Number is not prime
; -1 - String isn't a number

;=

Func _IsPrime($i_num)
If StringIsDigit($i_num) = 0 Then Return -1
If $i_num > 3 Then
If Mod($i_num, 2) = 0 Then Return 0
If Mod($i_num, 3) = 0 Then Return 0
EndIf
If $i_num = 1 Then Return 0
Dim $divisor, $increment, $maxdivisor
$divisor = 5
$increment = 2
$maxdivisor = Sqrt($i_num) + 1

Do
If Mod($i_num, $divisor) = 0 And $i_num <> $divisor Then Return 0
$divisor = $divisor + $increment
$increment = 6 - $increment
Until $divisor > $maxdivisor
Return 1
EndFunc ;==>
 
Zuletzt bearbeitet:
nobbe

nobbe

Dabei seit
13.03.2010
Beiträge
13.713
wobei es mir 2 lösungen bringt

x 200= 2
y 500= 11
z 1000= 263


x 200= 2
y 500= 17
z 1000= 443

schneller wäre das programm, wenn man zuerst alle prim zahlen von 1 -> m berechnet (Sieb des Eratosthenes), diese dann in ein array abspeichert , dann jeweils x,y,z als 1-> max aus den array füttert, so hätte man weniger vergleiche
 
Zuletzt bearbeitet:
nobbe

nobbe

Dabei seit
13.03.2010
Beiträge
13.713
ok

#include <Math.au3>
#include <String.au3>
#include <Misc.au3>

; x y + y^2 - z - 120 = 0
; als prime zahl

$max = 1000

Local $hTimer = TimerInit()

for $x1 = 2 to $max
for $y1 = 2 to $max
for $z1 = 2 to $max


if ( (_IsPrime($x1) == 1) AND (_IsPrime($y1) == 1) AND (_IsPrime($z1) == 1) ) THEN
; x y + y^2 - z - 120 = 0
if ( ($x1* $y1) + ($y1*$y1) - $z1 - 120 == 0 ) then

ConsoleWrite( "x 200= " & $x1 & @CRLF )
ConsoleWrite( "y 500= " & $y1 & @CRLF )
ConsoleWrite( "z 1000= " & $z1 & @CRLF & @CRLF)

Local $fDiff = TimerDiff($hTimer)
ConsoleWrite( "sec = " & ($fDiff / 1000) & @CRLF)

endif
ENDIF

Next
Next
Next

;===============================================================================
;
; Function Name: _IsPrime
; Description:: Check if a number is prime or not
; Parameter(s): $i_num - Number to check
; Requirement(s): None
; Return Value(s): 1 - Number is prime
; 0 - Number is not prime
; -1 - String isn't a number

;===============================================================================
;
Func _IsPrime($i_num)
If StringIsDigit($i_num) = 0 Then Return -1
If $i_num > 3 Then
If Mod($i_num, 2) = 0 Then Return 0
If Mod($i_num, 3) = 0 Then Return 0
EndIf
If $i_num = 1 Then Return 0
Dim $divisor, $increment, $maxdivisor
$divisor = 5
$increment = 2
$maxdivisor = Sqrt($i_num) + 1

Do
If Mod($i_num, $divisor) = 0 And $i_num <> $divisor Then Return 0
$divisor = $divisor + $increment
$increment = 6 - $increment
Until $divisor > $maxdivisor
Return 1
EndFunc ;==>


-----

x 200= 2
y 500= 11
z 1000= 23

sec = 0.2640169
 
Zuletzt bearbeitet:
Thema:

Der Knobelthread

Oben