2017-10-26 5 views
1

選択した数値のb-adic表現のコードを書きました。 printf関数はwhileループに入れなければならないため whileループでprintf関数の出力を逆にする

#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; 
} 

出力順序

は反転され、計算は、表現の最後の番号から始まります。

例= 10とB = 2
出力は0101
ですが、それはどのように私はこれを実現するために私のコードを変更することができます1010

する必要がありますか?

+1

Umm..recursion? –

+0

は1週間前にプログラミングを開始したので、これが何であるか分かりません。 – user758956

答えて

2

どのように私はこれを実現するために私のコードを変更できますか?

2のアプローチ:

は少なくともから最も重要なの桁を計算し、適切なサイズのバッファに保存します。これはOPのアプローチと似ていますが、後で印刷するために各桁の計算結果を保存します。

#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 
} 

再帰を使用します。より根本的な変化。これにより、より重要な数字の出力が最初に計算され、出力されます。

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"); 
} 

テスト

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); 
} 

出力

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

"arr"に格納されているように出力を配列に格納し、後で出力を逆順(終わりから終わりまで)で出力することができます。

#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

正当な理由がない限り、グローバルは使用しないでください。 – klutt

+0

非常に高く評価されています – user758956

+0

10000は多すぎると思いませんか?現時点では、ほとんどのハードウェアで 'int'が32ビットで表されていると考えてください。 –

関連する問題