C :: Aufgabe #147 :: Lösung #1

1 Lösung Lösung öffentlich
#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)?

#1
vote_ok
von devnull (8870 Punkte) - 27.02.2017 um 17:55 Uhr

Konsolenausgabe:


f(99) = 24098191203111400289917521965551215769124490985960345119037143818586892507
5918865878339112738328484815883888510575662376601551037951566303643245403727590635
57714095746708893

Quellcode ausblenden C-Code
/********************************************
 * 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

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben