Enter The Number You Want To Octal Equivalent Of : 1701
5
45
245
3245
试试这个看看它是否有帮助(不需要在数学库中链接)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int y = 0;
int n = 1;
printf("Enter The Number You Want To Octal Equivalent Of : ");
scanf("%d",&x);
while(x>0)
{
y = y + ((x%8)*n);
printf("%d\n" , y);
x = x/8 ;
n = n * 10;
}
printf("Octal Equivalent is : %d" , y);
return 0;
}
我假设你知道你可以做到这一点?
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int y = 0;
int n = 1;
printf("Enter The Number You Want To Octal Equivalent Of : ");
scanf("%d",&x);
while(x>0)
{
y = y + ((x&7)*n);
printf("%d\n" , y);
x = x>>3 ;
n = n * 10;
}
printf("Octal Equivalent is : %d" , y);
return 0;
}
或采用 ascii 方法
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int y = 0;
int n = 0;
char output[16];
printf("Enter The Number You Want To Octal Equivalent Of : ");
scanf("%d",&x);
while(x)
{
output[n++]=(x&7)+0x30;
x = x>>3 ;
}
output[n]=0x30;
printf("Octal Equivalent is : ");
while(n>=0)
{
printf("%c",output[n--]);
}
printf("\n");
return 0;
}
或许多其他解决方案...
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int y = 0;
int n = 0;
printf("Enter The Number You Want To Octal Equivalent Of : ");
scanf("%d",&x);
while(x)
{
y |= (x&7)<<n;
n+=4;
x>>=3;
}
printf("Octal Equivalent is : %X\n",y);
return 0;
}
编辑
1701 = 0x6A5 = 0b011010100101
所以如果你把二进制数分成四组,你可以看到十六进制值(从右边开始)
0110 1010 0101 = 0x6A5
如果你把它分成三个一组,你会看到八进制
011 010 100 101 = 03245
你可以看到我展示的最后一个解决方案是如何工作的,在每个上面加上一个零
011 010 100 101
0011 0010 0100 0101
你得到0x3245
了,正是你用 base 10 做的,但是用 base 16 代替,并利用了使用 shift 和 mask 的优化。
编辑 2
了解这一行代码中发生了多少事情(假设 x 和 y 是 int)
y = y + (x%8)*pow(10,n);
首先关闭操作顺序。欢迎编译器并且应该首先进行模运算,得到一个int
. 下一个操作顺序,括号将消除所有疑问。接下来是乘法,但一个操作数是 a double (pow)
,因此必须将模的结果提升为double
。并且发生了双重乘法。现在你已经添加了一侧是int
另一侧double
。所以这个 y 被提升到double
,double
添加发生然后double
toint
恰好存储在 中y
。如果您查看我的第一个更简单的示例,将 n go1, 10, 100, 1000
等视为一个,int
那么就没有double
促销它一直保持不变int
。
如果你做y
a float
,那么加法是 afloat + double
所以y
必须提升为双精度,双加法像以前一样发生,但现在存储到等号的左侧,作为 a float
,你有一个double
tofloat
转换,这允许四舍五入。因此,每次通过循环时,您都有机会让一小部分着陆y
。这里的问题,至少在你的例子中,我没有看到浮点格式无法处理的任何分数。模应该作为一个完成int
并且没有分数。如果您更改x
为 a float
,那么肯定会遇到问题。