为什么我的 to_base_n 程序不工作?

Why is my to_base_n Program not working?

我需要编写一个 C 程序,它将从用户输入中读取一个数字(以 10 为基数)并以任何 2 的幂为基数输出它。计算必须在一个函数中执行,to_base_n,它采用参数 numbase 并打印相应基数中的数字。作为验证检查,该程序还使用 isPowerofTwo 函数检查基数是否为 2 的幂。

执行转换的方式是通过长除法执行以下伪代码中的逻辑:

void to_base_n(int x, int n){
    int r, i = 0
    int digits[16]
    while (x ≠ 0){
        r = x mod n
        x = x / n
        digits[i] = r 
        i++
    }
    for (i = 0, i < 15, i++)
         print digits[i]
}

我认为这在算术上是合理的。但是,例如,当我尝试将 82000 转换为基数 4 时,我得到以下输出:

出现的大数字甚至比num本身还大,所以我认为modulus不能正确进入数组(因为∀{x,n}; x mod n < x)。我似乎找不到它有什么问题。完整代码如下。

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>

bool isPowerofTwo(int);
void to_base_n(int, int);

int main(){

    //Variables
    int num, base;

    //Prompt
    printf("Please enter a number in base 10: ");
    scanf("%d", &num);
    printf("Please enter a base (2^n) to convert it to: ");
    scanf("%d", &base);

    //Precaution
    while(!isPowerofTwo(base)){
        printf("That number is not a power of 2. Please try again: ");;
        scanf("%d", &base);
    }

    if(isPowerofTwo(base)){
    //Output
    printf("The number %d (base 10) is equivalent to ", num);
    to_base_n(num, base);
    printf(" (base %d).", base);
    }

    //Return Statement
    return 0;
}

//Checks if Base is a Power of Two
bool isPowerofTwo(int base){
    while((base % 2 == 0) && base > 1){
            base = base / 2;
            if(base == 1){
                return true;
                break;
            }
        }
        return false;
}

//to_base_n
void to_base_n(int x, int n){
    int r, i = 0;
    int digits[16];
    while(x != 0){
        r = x % n;
        x = x / n;
        digits[i] = r;
        i++;
    }
    for(i = 0; i < 15; i++)
        printf("%d|",digits[i]);
}

谁能帮忙解释一下这是怎么回事?

您忽略了用您的伪代码提取的位数,因此您打印了数组中未初始化的元素。

for (i = 0, i < 15, i++)
    print digits[i]

并且它们以相反的顺序打印。我建议改成这个

for (i = i - 1, i >= 0, i--)
    print digits[i]

并作为函数中的 C 代码

for(i = i - 1; i >= 0; i--)
    printf("%d|",digits[i]);

基数 4 中的数字 82000 将是: 110001100 这正是你得到的。你的错误是:

  • 它们是倒着打印的。

  • 你打印的数字比你应该打印的多,所以你打印了乱码。