PHP :: Aufgabe #144
2 Lösungen
Funktion über eine Natürliche Zahl
Anfänger - PHP
von hollst
- 20.02.2017 um 09:02 Uhr
Man schreibe ein Funktion f(n) mit dem Definitionsbereich (n) und dem Wertebereich (f(n)) der natürlichen Zahlen.
Die Funktion f(n) sei wie folgt zu konstruieren:
1.) Schreibe die Zahlen 1 ... n in absteigender Reihenfolge nebeneinander: n, n - 1, n - 2 ... 5, 4, 3, 2, 1
2.) Wandle diese Zahlen in ihre binärer Darstellen ohne führende Nullen: n, n - 1, n -2 ... 101, 100, 11, 10, 1
3.) Entferne jetzt das Komma zwischen den Binärzahlen, die sich damit ergebende neue Binärzahl ist f(n).
Beispiel: f(6) => 6, 5, 4, 3, 2, 1 => 110, 101, 100, 11, 10, 1 => 11010110011101 = 13725 (dezimal).
Fragen: Welchen Wert hat f(99)?
Die Funktion f(n) sei wie folgt zu konstruieren:
1.) Schreibe die Zahlen 1 ... n in absteigender Reihenfolge nebeneinander: n, n - 1, n - 2 ... 5, 4, 3, 2, 1
2.) Wandle diese Zahlen in ihre binärer Darstellen ohne führende Nullen: n, n - 1, n -2 ... 101, 100, 11, 10, 1
3.) Entferne jetzt das Komma zwischen den Binärzahlen, die sich damit ergebende neue Binärzahl ist f(n).
Beispiel: f(6) => 6, 5, 4, 3, 2, 1 => 110, 101, 100, 11, 10, 1 => 11010110011101 = 13725 (dezimal).
Fragen: Welchen Wert hat f(99)?
Lösungen:
PHP-Code
<?php function naturalnumber($number) { $erg = ""; for ($i = $number; $i > 0; $i--) { echo $i . " = " . decbin($i); echo "<br>"; $erg .= decbin($i); } echo "<br>"; echo "Binärergebnis: " . $erg; echo "<br>"; echo "Dezimalergebnis: " . bindec($erg); } naturalnumber(8); ?>
PHP-Code
<?php f(1.2); // passes a 1, due to typjuggle. f(-1); // f('apple'); // Results in "PHP Fatal error" f(0); f(5); f(6); f(12); f(19); f(99); function f(int $n) : void { $result = ''; // validate input if ($n >= 0) { $numbers = range($n, 0, -1); // get digits of number in descending order array_walk($numbers, function(int $number) use (&$result) { // convert decimal to bin, remove leading zeros, then concat to result. $result .= ltrim((string)decbin($number), '0'); }); $result = number_format(bindec($result), 0, '', '.'); // get decimal value and prettify result } else { $result = 'INVALID INPUT'; } echo "Given: $n\nResult: $result\n\n"; }
Aufgrund des absurd langen Ergebnisses war es hier nötig manuelle Zeilenumbrüche einzufügen, sodass dies in den CMD-Block passt.
Konsolenausgabe:
Given: 1
Result: 1
Given: -1
Result: INVALID INPUT
Given: 0
Result: 0
Given: 5
Result: 1.437
Given: 6
Result: 13.725
Given: 12
Result: 109.340.390.813
Given: 19
Result: 361.180.243.363.812.737.024
Given: 99
Result: 24.098.191.203.111.401.698.714.115.370.741.751.858.782.352.289.166.
467.579.315.576.670.861.733.173.202.856.913.776.437.554.342.177.303.417.
766.212.127.158.531.008.832.590.812.493.002.004.946.311.724.515.849.277.
759.389.052.174.336