2017-10-26 2 views
1

Ich schrieb einen Code für eine b-adic Darstellung einer gewählten Nummer.Die Ausgabe der printf-Funktion in der While-Schleife umkehren

#include <stdio.h> 

int b_adisch (int a, int b) 
{ 

    int x, y, mod, mod1; 

    x = a/b; 
    mod1 = a % b; 

    printf("%i\n", mod1); 

    do { 
    y = x/b; 
    mod = x % b; 
    x = y; 
    printf("%i\n", mod); 
    } while(x != 0); 
    return a ; 
} 

int main (void) 
{ 
    int a, b; 
    printf("pls input a "); 
    scanf("%i", &a); 
    printf("pls input b "); 
    scanf("%i", &b); 
    b_adisch(a, b); 

    return 0; 
} 

die Ausgabereihenfolge wird umgekehrt werden, da die printf in die while-Schleife gesetzt werden muss, und die Berechnung beginnt mit der letzten Ziffer der Darstellung.

Beispiel, wenn a = 10 und b = 2
Die Ausgabe 0101
ist, aber es sollte 1010

sein Wie kann ich den Code ändern, damit dies geschieht?

+1

Umm..recursion? –

+0

habe vor einer Woche mit der Programmierung begonnen, also habe ich keine Ahnung, was das ist ... – user758956

Antwort

2

Wie kann ich den Code ändern, dies zu verwirklichen?

2 Ansätze:

Berechnen Sie die Ziffern von gelinde bedeutendsten und in einer angemessenen Größe Puffer speichern. Dies ähnelt dem Ansatz von OP, speichert jedoch die Ergebnisse der Berechnung jeder Ziffer für das spätere Drucken.

#include <assert.h> 
#include <limits.h> 

void b_adisch(int value, int base) { 
    // Let us work with simple cases first. 
    assert(value >= 0); 
    assert(base >= 2 && base <= 10); 

    // Adequate sized buffer 
    char buffer[sizeof value * CHAR_BIT + 1]; 
    // Start at end 
    char *end = &buffer[sizeof buffer - 1]; 
    *end = '\0'; 

    do { 
    end--; 
    int digit = value%base; // Find least digit 
    value /= base; 
    *end = digit + '0'; // save the digit as text 
    } while (value); 

    printf("<%s>\n", end); // print it as a string 
} 

Rekursion verwenden. Eine radikalere Veränderung; Dies berechnet und druckt zuerst die Ausgabe der höherwertigen Stellen.

void b_adischR_helper(int value, int base) { 
    // If the value is at least 2 digits, print the most significant digits first 
    if (value >= base) { 
    b_adischR_helper(value/base, base); 
    } 
    putchar(value % base + '0'); // Print 1 digit as text 
} 

void b_adischR(int value, int base) { 
    // Let us work with simple cases first. 
    assert(value >= 0); 
    assert(base >= 2 && base <= 10); 

    printf("<"); 
    b_adischR_helper(value, base); 
    printf(">\n"); 
} 

-Test

int main() { 
    b_adisch(10, 2); 
    b_adischR(10, 2); 
    b_adisch(INT_MAX, 10); 
    b_adischR(INT_MAX, 10); 
    b_adisch(INT_MAX, 2); 
    b_adischR(INT_MAX, 2); 
} 

Ausgabe

<1010> 
<1010> 
<2147483647> 
<2147483647> 
<1111111111111111111111111111111> 
<1111111111111111111111111111111> 
-1

Sie können die Ausgabe in einem Array speichern, da sie hier in "arr" gespeichert wird und später die Ausgabe in umgekehrter Reihenfolge (von Ende bis Anfang) druckt.

#include <stdio.h> 
int arr[10000]={0}; 
void b_adisch (int a, int b) 
{ 
    int x, y, mod, mod1,i=0,j; 
    x = a/b; 
    mod1 = a % b; 
    arr[i++]=mod1; 
    do { 
    y = x/b; 
    mod = x % b; 
    x = y; 
    arr[i++]=mod; 
    } while(x != 0); 
    for(j=i-1;j>=0;j--) 
    printf("%i\n",arr[j]); 
} 

int main (void) 
{ 
    int a, b; 
    printf("pls input a "); 
    scanf("%i", &a); 
    printf("pls input b "); 
    scanf("%i", &b); 
    b_adisch(a, b); 

    return 0; 
} 
+0

Benutze keine Globals, außer du hast einen guten Grund. – klutt

+0

sehr geschätzt – user758956

+0

10000 ist ein bisschen zu viel, meinst du nicht? Bedenken Sie, dass ein 'int' auf der heutigen Hardware immer noch mit 32 Bits dargestellt wird. –

Verwandte Themen