Decimal to octal in C
我刚刚开始教自己K.N.King的C编程:一种现代方法(2ndedn)。
我很享受,但我希望在适当的时候把这个奇怪的问题贴在这里征求意见,因为不幸的是,我没有导师,有些人会提出更多的问题,然后他们会回答!
我在做一个关于取一个输入的整数并以八进制显示它的问题。它说有一个简单的方法来做它,但在书的后面。我提出了以下几点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
它可以工作,但我不擅长数学,我想知道是否有一种更有效的方法来做这件事,或者我做了唯一可能的方法…
如果其他人有这本书的话,那就是第4季度的71页。
谢谢你的时间。安得烈
另外,我的确在搜索引擎中搜索过,但找不到任何东西是这样"慢"地做的!
每个人都说,有一种内置的方法可以用
首先想到的是一个八进制数字正好是三位。因此,您可以这样进行转换:
- 回路
while n != 0 。 - 将
n 的最左边3位隔离到d 中,并打印d 。 - 左移
n 3位
代码很简单,但我并没有提供它,所以您可以自己做(您需要熟悉位和移位运算符才能做到这一点)。
简单的方法可能是使用
其他人已经发布了真正的生产代码答案,现在我从您的评论中看到您还没有完成循环。也许你的书在教你递归:
1 2 3 4 5 6 7 |
这适用于n>0。
1 2 3 4 5 6 7 8 9 10 11 12 | /* 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; } |
通过循环,您可以将五条非常相似的线卷起,如下所示:
。
一个好的编译器实际上会通过将它展开为五行来优化它,这样您将得到与开始时几乎相同的东西。把它写成循环的好处是你不能只在其中一行中犯错误。
编译器还将负责用3位的移位替换8的除法。二者都给出了相同的二进制结果,但后者更快。
用C语言将十进制转换为八进制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include<stdio.h> #include<conio.h> void main() { A: long int n,n1,m=1,rem,ans=0; clrscr(); printf(" Enter Your Decimal No ::"); scanf("%ld",&n); n1=n; while(n>0) { rem=n%8; ans=(rem*m)+ans; n=n/8; m=m*10; } printf(" Your Decimal No is :: %ld",n1); printf(" Convert into Octal No is :: %ld",ans); printf(" Press 0 to Continue..."); if(getch()=='0') goto A; printf(" \tThank You"); getch(); } |
。
现有的答案不够清楚,我不喜欢。这是我的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #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 } ", indecimal, output); fflush(stdout); return 0; } |
。
结果:
1 | { DEC: 1337, OCT: 2471 } |
由于只介绍了基本的内容,所以您不希望(至少在这一点上)使用函数、循环、位运算符、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
。
请注意,由于输出中不需要
这个
在
号