C :: Aufgabe #147 :: Lösung #1
1 Lösung
#147
Funktion über eine Natürliche Zahl
Anfänger - C
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)?
#1
von devnull (8870 Punkte)
- 27.02.2017 um 17:55 Uhr
Konsolenausgabe:
f(99) = 24098191203111400289917521965551215769124490985960345119037143818586892507
5918865878339112738328484815883888510575662376601551037951566303643245403727590635
57714095746708893
/********************************************
* fnn.c Funktion über natürliche Zahl
********************************************/
#include <stdlib.h>
#include <stdio.h>
#include <values.h>
#include <gmp.h>
char binary_buffer[600];
/* dezimal-binär - Konverter */
char *d2b(char *start, unsigned value) {
unsigned mask = ~(~0u>>1); // set 1 -> MSBit
unsigned num = value;
int msb = 0;
int bit, shift;
char *pos = start;
for (shift=0; shift<INTBITS; shift++) {
bit = num&mask;
if (msb|=bit)
*pos++ = (bit)?1:0;
num <<= 1;
}
return pos;
}
int main() {
char *next, *pos;
unsigned inzahl, zahl;
mpz_t mpow, mpowr, msum, msumr;
/* GMP - Init */
mpz_init(mpowr);
mpz_init(msumr);
mpz_init_set_ui(mpow, 1L);
mpz_init_set_ui(msum, 0L);
/* Eingabe */
printf("Natürliche Zahl (<=100) : ");
scanf("%u", &inzahl);
/* Binärzahl berechnen */
next=binary_buffer;
for (zahl=inzahl; zahl > 0; zahl--)
next = d2b(next, zahl);
/* Konversion in MP-Dezimalzahl */
for (pos=next-1; pos>=binary_buffer; pos--) {
if (*pos) {
mpz_add(msumr, msum, mpow);
mpz_set(msum, msumr);
}
mpz_mul_ui(mpowr, mpow, 2L);
mpz_set(mpow, mpowr);
}
/* Ausgabe binär + dezimal */
printf("Binärzahl hat %zd Bit:\n", next - binary_buffer);
for (pos=binary_buffer; pos<next; pos++)
printf("%c", (*pos)?'1':'0');
printf("\n\n");
gmp_printf("f(%d) = %Zu\n\n", inzahl, msum);
return 0;
}
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1
