在while循环中反转printf函数的输出

时间:2017-10-26 13:53:58

标签: c gcc printf do-while

我为所选数字的b-adic表示编写了代码。

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

输出顺序将反转 因为printf必须放入while循环,并且计算从表示的最后一个数字开始。

例如a = 10且b = 2
输出为0101
但它应该是1010

如何更改代码才能实现此目的?

2 个答案:

答案 0 :(得分: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 :(得分:-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;
}