【问题标题】:How do I properly convert to any base?如何正确转换为任何基地?
【发布时间】:2023-02-05 02:45:15
【问题描述】:

我的代码编译成功,但任何时候我运行参数./base.o 42 2,它将它转换为二进制形式的基数2,输出是0,而任何时候我运行./base.o 99 5,结果都是444重复。

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

int main(int argc, char *argv[]) {
    int remainder = 0;
    int num0 = 0;
    int i = 0;

    int num1 = atoi(argv[1]);
    int num2 = atoi(argv[2]);
    int quotient = num1;

    while (quotient != 0) {
        remainder = num1 % num2;
        quotient = quotient / num2;

        num0 = (remainder * pow(10, i)) + num0;
        i++;
    }

    printf("%d\n", num0);

    return 0;
}

【问题讨论】:

  • remainder = num1 % num2; 仔细检查是否正确。
  • 不要将 pow 用于整数。相反,跟踪一个单独的幂变量,该变量从 1 开始并在循环的每次迭代中乘以 10。

标签: c


【解决方案1】:

这里似乎有一个主要的混乱:

  • 程序参数似乎以 10 为基数表示,输出必须以与第二个参数相对应的基数生成。
  • 为此,假设至少有 2 个参数,转换 int num1 = atoi(argv[1]);int num2 = atoi(argv[2]); 是正确的,但循环中的计算不正确。
  • 您应该改为将余数存储在一个数组中,并以相反的顺序将这些余数输出为数字。

这是修改后的版本:

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

int main(int argc, char *argv[]) {
    int remainder[32];
    int num1, num2, quotient, i;
    const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";

    if (argc > 2) {
        num1 = atoi(argv[1]);
        num2 = atoi(argv[2]);
        quotient = num1;
        i = 0;
        for (;;) {
            remainder[i++] = quotient % num2;
            quotient = quotient / num2;
            if (quotient == 0)
                break;
        }

        while (i > 0) {
            putchar(digits[remainder[--i]]);
        }
        putchar('
');
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-19
    • 2021-11-21
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多