[Python-de] [Python vs. C] 3n+1-Problem

daniel.poelzleithner poelzi at poelzi.org
Die Feb 10 18:41:02 CET 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Jens Kubieziel wrote:
| Hallo,
|
| ich habe mir kürzlich diverse Programmieraufgaben der Universidad da
| Valladolid (http://acm.uva.es) angeschaut und u.a auch
| http://acm.uva.es/p/v1/100.html.
|
| Hierbei wird das 3n+1-Problem (teile eine Zahl solange durch zwei, wenn
| sie gerade ist oder, falls nicht, multipliziere mit drei und addiere
| eins, bis man eins erreicht.) vorausgesetzt. Wenn z.B. 3 eingegeben
| wird, entsteht die Folge: 3 10 5 16 8 4 2 1. Aufgabe ist nun, in einem
| einzugebenden Intervall die Anzahl aller Folgenglieder (im obigen Bsp.
| 8) zu errechnen und auszugeben.
|
| Dies habe ich zunächst mit folgendem Brute-Force-Ansatz probiert:
|
| #v+
| i = int(raw_input("Please enter the lower boundary: "))
| j = int(raw_input("Please enter the upper boundary: "))
|
| total_rounds = []
|
| print i,j,
| for number in range(i,j+1):

xrange benutzt einen generator und verbraucht weniger speicher. Ich
würde aber eine while schlaufe benutzten, die währe aquivalent zu deiner
for schleife in c

|   total_rounds.append(rounds)
|   total_rounds.sort()

wo sind diese beiden zeilen in deinem c programm ?
Beide funktionen sind sehr sehr speicher und rechenzeit intensiv.


| print total_rounds[len(total_rounds)-1]
du erzeugst das riesige array nur um den letzten wert zu bekommen, da
hätte es auch ein print rounds getan.


#!/usr/bin/python -OO

i = int(raw_input("Please enter the lower boundary: "))
j = int(raw_input("Please enter the upper boundary: "))

print i,j,
rounds = 1
maxr = 0
maxi = 0

while i < j:
	n = i
	rounds = 0
	while n > 1:
		if n % 2 == 0:
			n = n/2
		else:
			n = 3*n+1
		rounds += 1
	if rounds > maxr:
		maxr = rounds
		maxi = i
	#print i," runs:", rounds
	i += 1
print "max bei %i mit %i runden" %(maxi, maxr)


Das kommt dem c programm näher.
Noch angemerkt:
Das C Programm benutzt register Variablen, ist also direkt im cpu L2
(oder wars L1 ?) Speicher, das ist natürlich nicht zu vergleichen.

[poelzi at cruor]> tmp/  ./n3+1.py
Please enter the lower boundary: 1
Please enter the upper boundary: 1000000
1 1000000 max bei 837799 mit 524 runden

Hat etwa 3 minuten gedauert :)

Gruß
~ Daniel


- --
nihil me cirumdat

.. . .. ... . . .. . ... . .. . ... . . .
pgp key @ http://files.poelzi.org/pgp.txt
ED80 E53D 5269 4BB1 1E73 3A53 CBF9 A421 0A7B 003D
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
Comment: Using GnuPG with Debian - http://enigmail.mozdev.org

iD8DBQFAKRety/mkIQp7AD0RAgksAJ9zNsHrgEbUrOvzK2RRE6JUxjU3JACfe4Qz
G4IQCfwB1imjuJ2gBEKzleE=
=j/Nu
-----END PGP SIGNATURE-----