Hallo,
ansich ist es ein programmiertechnisches Problem, aber mti mathematischer Grundlage,
gegeben sei ein „Baum“, der in jeder Ebene ein Element mehr besitzt als ind er vorherigen, ich werde ihn mal folgendermassen darstellen:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
dies kann beliebig viele Elemente enthalten.
Ich möchte nun zu einer beliebigen Zahl jeweils die Zahl ausrechnen, di direkt drübersteht (wenn da keine steht, weil es das Element ganz links ist, dann die daneben).
Also:
3 -> 1 (aber auch 2 -> 1)
9 -> 5
13 -> 8
Kann mir jemand dazu eine mathematische Beziehung formulieren?
ich denke mal es gibt eine… vielleicht seht ihr die schneller als ich…
Bruno
Du brauchst auf jeden Fall noch eine weitere Info wenn di Reihe weitergehen soll (z.b.: die erste Zahl unten oder so), weil sich die zahlen wiederholen wenn man die reihe weiterführt. Bei der nächsten Spalte stimmt die 11 und 7 und 4 noch weil da die diagonale Regel gilt aber bei der Übernächsten gibts Probleme mit der 8: einaml steht über der 8 ne 4 (3te Spalte) und einmal ne 5 (letzte Spalte die dasteht) (dasselbe mit den beiden 3ern) außerdem ist offen was bei ? hinkommt (gibts nur positive Zahlen?).
?
1 2
1 2 3
2 3 4 5
4 5 6 7 8
7 8 9 10 11 12
11 12 13 14 15 16 17
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
Hi,
Du hast bis zur n-ten Zeile n(n+1)/2 Zahlen, so dass also n(n+1)/2-k unter n(n-1)/2-k steht. Die Differenz ist die Zeilenl"ange der n-ten Spalte, also n, und um zu einer Zahl das passende n zu finden… also entweder eine Tabelle mit den Zeilenenden oder Wurzel-ziehen und nachpr"ufen mit Korrektur um ens nach oben/unten
n(n-1)/2
äääh ich versteh deine Frage nicht so ganz.
Also den Sonderfall 1 kann ich leicht abfangen, unter 1 geht es nicht.
Ich glaub ich han das auch nicht ganz verständlich beschrieben, es handelt sich hier einfach um eine aufsteigende Liste aller natürlichen Zahlen von 1 bis N:
also 1,2,3,4,5,6,7,8,9,10,11,12…N
die werden aber so angeordnet dass in jeder Zeile ein Element mehr steht als in der davor, in der 1. Zeile steht nur das Element 1.
bei N=3 z.b.:
1
2 3
bei N=5:
1
2 3
4 5
bei N=19:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19
verständlich?
Bruno
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
Ich möchte nun zu einer beliebigen Zahl jeweils die Zahl
ausrechnen, di direkt drübersteht (wenn da keine steht, weil
es das Element ganz links ist, dann die daneben).
Zunächst würde ich die Zeile Z berechnen, in der die gegebenen zahl X steht: Z = INT(SQRT(0.25+2(X-1))+0.5)
Dann würde ich Testen, ob es sich um eine Zahl handelt, die ganz links steht. Das ist dann der Fall, wenn X = Z(Z-1)/2+1 gilt.
Handelt es sich um einen Sonderfall, dann erhalte ich die gesuchte Zahl Y gemäß Y = X-Z+1 ansonsten gilt Y = X-Z.
In einem Pascal-Programm würde das so aussehen:
**function** NumberOverThisNumber(X:Integer):Integer ;
**var**
Z: Integer ;
**begin**
Z:=round(int(sqrt(0.25+2\*(X-1))+0.5)) ;
**if** X=Z\*(Z-1)/2+1 **then** Result:=X-Z+1 **else** Result:=X-Z ;
**end** ;
Zunächst würde ich die Zeile Z berechnen, in der die
gegebenen zahl X steht: Z =
INT(SQRT(0.25+2(X-1))+0.5)
da muss noch irgendwo n Fehler drinstecken leider…
ansich such ich genau sowas wie du mir hier gegeben hast, aber probier mal z.b. mit der Zahl 3
3-1=2
2*2=4
4+0,25=4,25
sqrt(2,25)=2,06…
2,06+0,5=2,56
Round(2,56)=3
Die Zahl 3 liegt aber in der Zeile 2.
Hast du ne Idee worans liegt? Kanns leider nicht korrigieren weil ich den Ansatz auch nicht verstehe. Der is mir auch nicth weiter wichtig, so es funktionieren würde 
Bruno
ach so…
Habs glaub falsch verstanden, wenn ich nicht runde, sondern „floore“, also den Rest einfach abschneide, dann scheints zu gehen.
bru
Yeah!
Habs grad mal für die ersten 20 Werte überprüft, stimmt immer 
dann geh ich mal davon aus, dass es korrekt ist.
Mehr als 20 wirds vermutlich sowieso nicht werden, deswegen dachte ich auch schon dran es hart für alle 20 Fälle einzucodieren, aber so ists natürlich besser 
Tausend Dank
Bruno
Habs glaub falsch verstanden, wenn ich nicht runde, sondern
„floore“, also den Rest einfach abschneide, dann scheints zu
gehen.
Wenn man rundet müßte man nicht FLOOR(SQRT(0.25+2(X-1))+0.5), sondern nur ROUND(SQRT(0.25+2(X-1))) nehmen.
Wenn man rundet müßte man nicht FLOOR(SQRT(0.25+2(X-1))+0.5),
sondern nur ROUND(SQRT(0.25+2(X-1))) nehmen.
keine Ahnung
ich kenn mich mit Pascalsyntax oder was das war nicht aus…
auf jeden Fall in meinem PHP-Script geht es wenn ich floor() schreibe
Thanx
Bru
keine Ahnung
ich kenn mich mit Pascalsyntax oder was das
war nicht aus…
In PHP dürfte die Syntax dieselbe sein. Zumindest gibt es dort die Funktionen Floor und Round, wobei Round(x) dasselbe Ergebnis liefert, wie Floor(X+0.5).
Ach jetzt blick ichs 
stimmt natürlich, dafür brauchst du das 0,5 hehe
Bru
dafür brauchst du das 0,5 hehe
Nee, die 0.5 ergeben sich, wenn ich X=Z(Z-1)/2+1 nach Z umstelle.
Zunächst würde ich die Zeile Z berechnen, in der die
gegebenen zahl X steht: Z =
INT(SQRT(0.25+2(X-1))+0.5)
Vielleicht fragt sich der eine oder andere wie man darauf kommt ?!
Mit etwas Arithmetik und Algebra ist das leicht einzusehen („Z“: Zeilennummer, „[min]“: kleinste und „[max]“ grösste Zahl einer Zeile)
Zuerst überlege man sich eine Gesetzmäßigkeit für die Folge der [max] und [min] (
Indem man nun wegschneidet („trunc“) oder die kleinste ganze Zahl (also Z) ermittelt („floor“), erhält man die richtige Zeilennummer.
Dann würde ich Testen, ob es sich um eine Zahl handelt, die
ganz links steht. Das ist dann der Fall, wenn X =
Z(Z-1)/2+1 gilt.
Darauf kommt man, indem man (1) in (2) einsetzt und X=[min] überprüft.
Handelt es sich um einen Sonderfall, dann erhalte ich die
gesuchte Zahl Y gemäß Y = X-Z+1 ansonsten gilt
Y = X-Z.
Das wird klar, wenn man einsieht, dass in jeder Zeile genau Z Zahlen stehen und diese „rechtsbündig“ angeordnet werden.
Gruss