PHP :: Aufgabe #144

2 Lösungen Lösungen öffentlich

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)?

Lösungen:

vote_ok
von syneex (2670 Punkte) - 20.08.2018 um 09:30 Uhr
Quellcode ausblenden 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);
?>
vote_ok
von Exception (7090 Punkte) - 11.09.2020 um 19:56 Uhr
Quellcode ausblenden 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
1810863

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.