2017-10-26 1 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; 
} 

출력 순서

는 반전되고 계산은 표현의 마지막 번호로 시작한다.

예 A = 10, B = 2
출력은 0101
이지만 내가이 일어날 수 있도록 코드를 변경하려면 어떻게 1010

해야하는지?

+1

Umm..recursion? –

+0

일주일 전에 프로그래밍을 시작 했으므로 이것이 무엇인지 잘 모릅니다 ... – user758956

답변

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 비트로 표현된다고 생각하십시오. –

관련 문제