如何在不使用数组或 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]);
}
}
您从单位位开始转换。
也许从最高有效数字开始?
// 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
位。对于每个数字,
- 将
n
的当前值除以当前位的位值pv
得到一个位值
- 将
n
替换为 n % pv
。
小心一直向下到位值 1,而不是在 n
变为零时停止。
我一直在研究将给定数字(十进制基数)转换为从 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]);
}
}
您从单位位开始转换。
也许从最高有效数字开始?
// 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
位。对于每个数字,- 将
n
的当前值除以当前位的位值pv
得到一个位值 - 将
n
替换为n % pv
。
小心一直向下到位值 1,而不是在
n
变为零时停止。- 将