我刚开始用K.N King的C编程:现代方法(2ndEdn)教自己C语言。
我很享受,但我希望在适当的时候在这里发出一些奇怪的问题,因为很遗憾,我没有导师,有些人会提出更多问题然后他们回答!
我正在做一个关于输入整数并以八进制显示它的问题。它说有一种简单的方法可以做到,但这本书后面会有。我想出了以下内容:
// Convert a number to octal
int n, n2, n3, n4, n5, n6;
printf("Enter a number between 0 and 32767: ");
scanf("%d", &n);
n6 = n % 8;
n5 = (n / 8) % 8;
n4 = ((n / 8) / 8) % 8;
n3 = (((n / 8) / 8) / 8) % 8;
n2 = ((((n / 8) / 8) / 8) / 8) % 8;
printf("%d%d%d%d%d", n2, n3, n4, n5, n6);
它运作正常,但我不擅长数学,并且想知道是否有更有效的方法可以做到这一点,或者我是否尽可能地完成了这项工作......
如果其他人有这本书,那就是Q4 p.71。
感谢您的时间。 安德鲁
P.S我确实在搜索引擎中查找但是找不到任何以“慢”方式执行的操作!
答案 0 :(得分:5)
每个人都说得对printf
有一种内置的方法。但是自己做呢?
首先想到的是一个八进制数字恰好是三位。因此,您可以通过这种方式进行转换:
while n != 0
n
的最左边3位隔离到d
并打印d
n
3位代码很简单,但我没有提供,所以你可以自己做(你需要熟悉按位和转移 {{3为了做到这一点)。
答案 1 :(得分:4)
简单的方法可能是使用printf()
的{{1}} format specifier:
%o
答案 2 :(得分:3)
其他人发布了真实的生产代码答案,现在我从你的评论中看到你还没有完成循环。也许你的书试图教你递归:
void print_oct(int n)
{
if (n != 0) {
print_oct(n / 8);
printf("%d", n % 8);
}
}
这适用于n> 0
答案 3 :(得分:1)
使用循环,您可以像这样卷起五条非常相似的行:
for (int d = 8 * 8 * 8 * 8; d > 0; d /= 8)
printf("%d", n / d % 8);
printf("\n");
d
将从8 * 8 * 8 * 8
开始,这是您用于n2
的除数,然后逐步执行8 * 8 * 8
,8 * 8
,8
最后1
,这是n6
的除数,沿途打印每个数字。
一个好的编译器实际上会通过将它展开回五行来优化它,所以你将得到几乎与你开始时相同的东西。将它写成循环的优点是你不能只在其中一行中犯错。
编译器还将使用3位移位替换8。两者都以二进制形式给出相同的结果,但后者更快。
答案 4 :(得分:1)
/* Converts a positive base_10 into base_b */
int DecimalToBase(int n, int b)
{
int rslt=0, digitPos=1;
while (n)
{
rslt += (n%b)*digitPos;
n /= b;
digitPos *= 10;
}
return rslt;
}
答案 5 :(得分:0)
在%o
printf
格式说明符
printf("Enter a number between 0 and 32767: ");
scanf("%d", &n);
printf("%o", n);
答案 6 :(得分:0)
由于只引入了基础知识,所以你不希望(至少在这一点上)使用函数,循环,按位运算符,%o
格式说明符和所有这些东西。这是我的基本解决方案:
int n, d1, d2, d3, d4, d5, o;
printf("Enter a number between 0 and 32767: ");
scanf("%d", &n);
d5 = n % 8;
n /= 8;
d4 = n % 8;
n /= 8;
d3 = n % 8;
n /= 8;
d2 = n % 8;
n /= 8;
d1 = n % 8;
o = 10000 * d1 + 1000 * d2 + 100 * d3 + 10 * d4 + d5;
printf("In octal, your number is: %.5d\n", o);
请注意,由于输出中不需要n
,因此您可以为每个步骤修改(除)(因此可以节省分数,这在计算上相对昂贵)。您最安全32767
(八进制:77777
),32768
(8 * 8 * 8 * 8 * 8 = 8 ^ 5 =(2 ^ 3)^ 5 = 2 ^ 15)是第一个数字,需要八进制的八位数:100000
。
这个o
变量并不是真正需要的,当int
16位签名(在某个古老的系统上)时,它不会起作用,因此从这一点开始,最好只打印单独的数字。
答案 7 :(得分:0)
根据自己的喜好,现有的答案并不够干净。这是我的:
#include <stdio.h>
#define OCTALBASE 8
#define OCTALSIZE 8
int main(int argc, char **argv) {
int indecimal = 1337;
char output[OCTALSIZE + 1];
output[OCTALSIZE] = '\0';
int outindex = OCTALSIZE;
int outdigit = 0;
int outvalue = indecimal;
while (--outindex >= 0) {
outdigit = outvalue % OCTALBASE;
if (outvalue > 0 || outdigit > 0)
{ output[outindex] = '0' + outdigit; }
else { output[outindex] = ' '; }
outvalue /= OCTALBASE;
}
fprintf(stdout, "{ DEC: %8d, OCT: %s }\n", indecimal, output);
fflush(stdout);
return 0;
}
结果:
{ DEC: 1337, OCT: 2471 }