如何在不使用数组或 C 中的指针的情况下反向打印值

How to print values in reverse without the use of arrays nor pointers in C

我一直在研究将给定数字(十进制基数)转换为从 2 到 16 的任何其他基数的代码。

显然,我遇到了函数 base_conversion_it(它代表迭代)反向打印值的问题。

我不能使用数组和指针,网上的每个人似乎都是这样解决这个问题的。我的作业需要同时创建迭代函数和递归函数(我做过并且有效)。

void base_conversion_it(unsigned int n, unsigned int b) {

    if (n > 0) {

        //bases between 2 and 16
        if (b >= 2 && b <= 16) {

            int r;          //r = remainder
            int q = 1;      //quotient
            int num;        //saves the remainder

            while (q != 0) {

                r = n % b;
                printf("%X", r);

                q = n / b;
                n = q;
            }
        }
    }
}

抱歉错过了迭代。

char digits[] = "0123456789ABCDEFGHIJKLMNOP";

void print(unsigned long long val, unsigned base)
{
    unsigned long long mask = base;
    while(val / mask >= base) mask *= base;
    do
    {
        printf("%c", digits[val / mask]);
        val %= mask;
        mask /= base;
    }while(val);
}

int main(void)
{
    print(45654756453, 10); printf("\n");
    print(45654756453, 16); printf("\n");
    print(45654756453, 24); printf("\n");
    print(45654756453, 2); printf("\n");
}

https://godbolt.org/z/W3fGnnhYs

递归:

char digits[] = "0123456789ABCDEF";

void print(unsigned long long val, unsigned base)
{
    if(base <= 16 && base > 1)
    {
        if(val >= base) print(val / base, base);
        printf("%c", digits[val % base]);
    }
}

https://godbolt.org/z/84hYocnjv

您从单位位开始转换。
也许从最高有效数字开始?

// It's Undefined Behaviour if `b` is outside the range [2...16]
void base_conversion_it(unsigned int n, unsigned int b) {
    unsigned highestbase = 1;
    while (highestbase * b <= n) highestbase *= b; //possible wrap around and infinite loop

    while (highestbase) {
        printf("%X", n / highestbase);
        n %= highestbase;
        highestbase /= b;
    }
    printf("\n");
}

如果您既不能使用数组(包括字符串)也不能使用递归,那么我认为您需要按最高有效优先顺序计算输出数字。这比以相反的顺序计算它们并反转结果有点不自然,但可以做到:

  • 使用循环求出n的最高位非零基-b位的位值。例如,检查 n 除以 b 的连续次方的结果,直到结果为 0,然后退一步。

  • 在一个单独的循环中,从已发现的最高位开始,一个接一个地读取 n 的基 b 位。对于每个数字,

    1. n的当前值除以当前位的位值pv得到一个位值
    2. n 替换为 n % pv

    小心一直向下到位值 1,而不是在 n 变为零时停止。