使用数组进行临时存储的解决方案:
int octal, total = 0, length=0;
char storage[12]; /* 11 octal digits add up to > 1 billion */
octal = 123;
while (octal > 0)
{
storage[length] = octal % 8;
octal /= 8;
length++;
}
while (--length >= 0)
printf ("%d", storage[length]);
printf ("\n");
(我碰巧处于 C 模式,因此将printf
s. 更改为cout
需要的位置。)
最重要的一点是你受storage
大小的约束。您可以将其设置为合理的大小 - 您可以放入整数的最大正八进制大小是017777777777
- ,甚至可以接受不合理的大小(您可以将其设置为 20,这只会浪费 8 个额外的字节;这些天,那没什么)。存储大小取决于您的数字以八进制表示的大小,对于您可以输入的最大数字。
假设您将两个8
s 都更改为2
; 然后您可以使用相同的例程进行二进制输出。但此时,输出字符数增加到 31 个!(比您的 [可能] 位数少一个int
,因为最后一位会将数字切换为负数。您需要单独的代码来处理负数。)
它适用于所有 <=10 的基数(包括“基数 10”本身)。如果要扩展相同的代码以处理基数 >10,例如“十二进制”(基数 12)或十六进制(基数 16),则需要更改该printf
行。这将使您的代码以 36 为底(“六进制”)。按照惯例,大于 9 的“数字”写成 A、B、C 等等:
while (--length >= 0)
printf ("%c", storage[length] < 10 ? storage[length]+'0' : storage[length]+'A'-10);
(当我在撰写本文时,为了方便起见,我使用了三元运算符?..:..
,而不是需要更多输入的单独的if..else
。(OTOH,添加注释否定了增益。哦,好吧 - 至少你了解三元运算符,以及几个数字基数的名称。))
另一种解决方案是使用递归。这是一个有用的方法,因为它不需要在内存中预先分配一些空间——相反,它依赖于内部调用堆栈。
原则是您编写一个仅打印您的号码的最后一位数字的函数 - 但在此之前,除非余数为 0,否则它会使用该号码的余数调用自身。
所以函数调用自己,然后打印它应该的数字。因为它首先调用自己,所以被调用的版本会打印它应该打印的数字—— “原始”函数中数字左边的数字。以此类推,直到没有剩余要打印的数字为止。从那时起,最后被调用的函数打印它的编号(即最左边的数字),返回到调用它的函数,该函数又打印它的编号(向右多一个),一直到原来的称呼。
递归是一项非常酷的掌握技能,所以一定要试试这个!