c语言进制转换相关问题

我在做学校的新生练习题时,对一道题目有疑问,我开始是直接写了一道判断的,但没有通过,后来用了个递归才过了,但不知道一开始那一段代码的错误出现在哪里。
下面是题目:

题目描述
输入一个十进制数N,将它转换成R进制数输出。

输入格式
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R不等于10)。

输出格式
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

样例输入
7 2
23 12
-4 3
样例输出
111
1B
-11

这段是我无法通过的代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    int n, r; char  arr[100] = { 0 };
    while (~scanf("%d%d", &n, &r) && r >= 2 && r <= 16) {
        if (n < 0) {
            printf("-");
            n = -n;
        }
        int i = 0; int len = 0;
        int u = n % r;
        while (n > 0) {
            arr[i] = n % r;
            n = n / r;
            i++;
            len++;
        }
        for (int i = len - 1; i > 0; i--) {
            printf("%d", arr[i]);
        }
        if (r >= 10 && r <= 16) {
            printf("%c", u + 55);
        }
        else {
            printf("%d", arr[len - 1]);
        }
        printf("\n");
    }return 0;
}

以下这段是我通过的递归代码:

#include <stdio.h>
#include <string.h>

void convert(int n, int r) {
    static char digits[] = "0123456789ABCDEF";

    if (n >= r) {
        convert(n / r, r);
    }
    putchar(digits[n % r]);
}

int main() {
    int n, r;

    while (scanf("%d%d", &n, &r) == 2 && r >= 2 && r <= 16) {
        if (n < 0) {
            putchar('-');
            n = -n;
        }
        convert(n, r);
        putchar('\n');
    }

    return 0;
}

非常感谢


int main()
{
    int n, r;
    char arr[100] = {0};
    while (~scanf("%d%d", &n, &r) && r >= 2 && r <= 16)
    {
        if (n < 0)
        {
            printf("-");
            n = -n;
        }
        int i = 0;
        int len = 0;
        // int u = n % r;
        while (n > 0)
        {
            arr[i] = n % r;
            n = n / r;
            i++;
            len++;
        }
        // for (int i = len - 1; i > 0; i--) {
        for (int i = len - 1; i >= 0; i--)
        {
            // printf("%d", arr[i]);
            // }
            //  if (r >= 10 && r <= 16)
            if (arr[i] >= 10)
            {
                // printf("%c", u + 55);
                printf("%c", arr[i] - 10 + 'A');
            }
            else
            {
                // printf("%d", arr[len - 1]);
                printf("%d", arr[i]);
            }
        } //
        printf("\n");
    }
    return 0;
}

【以下回答由 GPT 生成】

首先,我们来看一开始无法通过的代码。

这段代码的思路是不断地将十进制数n除以进制数r,得到的余数存入数组arr中,最后逆序输出数组中的元素。

但是在这段代码中,有两个问题:

  1. 数组arr的大小只有100,而题目中说明N是32位整数,这意味着当十进制数N太大时,arr可能装不下所有的余数,导致结果错误。所以需要扩大数组arr的大小。

解决方案:将数组arr的大小改为64位整数的最大位数,也就是8字节。

char arr[64] = { 0 };
  1. 在逆序输出数组arr元素时,循环的条件应该改为i >= 0,而不是i > 0。因为数组arr的索引是从0开始的,所以要包括索引为0的元素。

解决方案:将循环条件改为i >= 0

修改后的代码如下所示:

#include <stdio.h>
#include <string.h>
#include <math.h>

int main()
{
    int n, r;
    char arr[64] = { 0 };
    while (~scanf("%d%d", &n, &r) && r >= 2 && r <= 16) {
        if (n < 0) {
            printf("-");
            n = -n;
        }
        int i = 0;
        int len = 0;
        int u = n % r;
        while (n > 0) {
            arr[i] = n % r;
            n = n / r;
            i++;
            len++;
        }
        for (int i = len - 1; i >= 0; i--) {
            printf("%d", arr[i]);
        }
        if (r >= 10 && r <= 16) {
            printf("%c", u + 55);
        }
        else {
            printf("%d", arr[len - 1]);
        }
        printf("\n");
    }
    return 0;
}

接下来,我们来看通过的递归代码。

这段代码使用了递归的思想,通过不断地将十进制数n除以进制数r,并把余数转换为对应字符存储在数组digits中,然后逆序输出数组中的字符。

这段代码没有明显的问题,但需要注意一点是要静态声明字符数组digits,这样才能在多次递归调用中保持数组的内容不被覆盖。

可以不使用字符串的循环输出函数(如puts, fprintf),而是使用putchar函数,每次输出一个字符,以避免额外的计算量。

修改后的代码如下所示:

#include <stdio.h>
#include <string.h>

void convert(int n, int r) {
    static char digits[] = "0123456789ABCDEF";
    if (n < 0) {
        putchar('-');
        n = -n;
    }
    if (n / r) {
        convert(n / r, r);
    }
    putchar(digits[n % r]);
}

int main() {
    int n, r;
    while (~scanf("%d%d", &n, &r) && r >= 2 && r <= 16) {
        convert(n, r);
        printf("\n");
    }
    return 0;
}

以上就是针对这道题目的解决方案,希望能对您有所帮助。如果还有任何问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^