Es gibt eine Verbindung zwischen den Zeilennummern und den Dreieckszahlen. Die nth triangular number, bezeichnet mit T n, ist gegeben durch T n = n (n-1)/2. Die ersten paar Dreieckszahlen sind 0, 1, 3, 6, 10, 15, usw., und wenn Sie bemerken, sind die Starts jeder Reihe durch die n-te Dreieckszahl gegeben (die Tatsache, dass sie aus diesem Dreieck kommen) woher dieser Name kommt.)
Also wirklich, das Ziel hier ist, die größte n so zu bestimmen, dass T n i. Ohne jede kluge Mathe zu tun, könnten Sie dies in der Zeit O (√ n) von nur Rechen T , T , T usw. lösen, bis Sie etwas, das größer ist als ich finden. Noch besser ist, Sie könnten binäre Suche für sie in der Zeit O (log n) von T Berechnung , T , T , T usw., bis Sie überschreiten, dann binäre Suche auf den Bereich du fandest.
Alternativ könnten wir versuchen, dies direkt zu lösen. Angenommen, wir die Wahl von n, so dass
n (n + 1)/2 = i
erweitern, erhalten wir
n /2 + finden wollen n/2 = i.
Gleichwertig
n /2 + n/2 - i = 0,
oder, noch einfacher:
n + n - 2i = 0.
Nun verwenden wir die quadratische Formel:
n = (-1 ± √ (1 + 8i))/2
Die negative Wurzel wir ignorieren können, so dass der Wert n wir wollen, ist
n = (-1 + √ (1 + 8i))/2.
Diese Zahl wird nicht notwendigerweise eine ganze Zahl sein, so dass die Zeile, die Sie wollen zu finden, die wir abrunden gerade:
row = & lfloor; (- 1 + √ (1 + 8i))/2 & rfloor ;.
In Code:
int row = int((-1 + sqrt(1 + 8 * i))/2);
Lassen Sie uns bestätigen, dass dies funktioniert es durch die Prüfung ein bisschen aus. Wohin gehen 9? Nun, wir haben
(-1 + √ (1 + 72))/2 = (-1 + √ 73)/2 = 3,77
Abrunden, sehen wir, es geht in der Reihe 3 - was ist richtig!
Einen anderen versuchen, wo geht 55? Nun,
(-1 + √ (1 + 440))/2 = (√ 441 - 1)/2 = 10
So sollte es gehen in Zeile 10. Die zehnte Dreieckszahl ist T = 55, also in der Tat beginnt 55 von dieser Reihe. Sieht so aus, als ob es funktioniert!