我正在尝试使用递归将十进制数转换为二进制数。 但我的输出错误...我试图调试程序并陷入“pow()”。 我插入了许多printf语句来查看变量的状态...... 这是我的计划......
#include<stdio.h>
#include<conio.h>
#include<math.h>
void main(){
int n,k;
int z;
long b,j;
long binary(int,int);
printf("Enter a Number : ");
scanf("%d",&n);
printf("Binary Equivalent is : ");
k=log2(n);
b=binary(n,k);
z=pow(10,k);
printf("\n\nb=%d ,z=%d",b,z);
}
long binary(int n,int c)
{
int a,np;
static long b=0;
if(n<=1){
b=(n%2)*(int)pow(10,c)+b;
printf("\n nmod2=%d\nb=%ld\nc=%d\nn=%d ",(n%2),b,c,n);
return b;
}
else{
a=n%2;
np=pow(10,c);
b=a*np+b;
printf("\n a=%d,np=%d \n nmod2=%d \n b=%ld \n c=%d \n n=%d ",a,np,(n%2),b,c,n);
binary(n/2,--c);
}
}
Output is:
Enter a Number : 5
Binary Equivalent is :
a=1,np=99
nmod2=1
b=99
c=2
n=5
a=0,np=10
nmod2=0
b=99
c=1
n=2
nmod2=1
b=100
c=0
n=1
b=100 ,z=100
为什么二元()中的“pow(10,c)”在c = 2时等于99为什么不是100,如在main()中那样?
答案 0 :(得分:3)
问题在于:
(int)pow(10,c)
结果大约是100,但是使用(int)
将其四舍五入可以得到99或100,具体取决于pow
的舍入误差。
这是math.h
中的一个方便的功能lround
,可以帮助您。它将数字舍入为最接近的整数,将0.5
向零舍入。
或者,您可以定义:
int my_round(double f) {
return (int)(f+0.5);
}
添加0.5并向下舍入看起来像四舍五入到最接近的整数。
答案 1 :(得分:1)
pow()函数是一个浮点函数,它往往搞砸了这些东西。如果没有适当的舍入来补偿,你不应该将它用于整数。
答案 2 :(得分:0)
多个问题。
正如其他人指出pow(10,c)
的结果是问题所在。 好 pow()
将为pow(10,2)
返回完全 100.0。期望来自pow()
的行为是合理的,但谨慎的程序员会像其他人建议的那样做,并且将浮点数舍入为int
。
舍入到最近是具有库函数的最佳句柄。如果想要自己动手:
int IRound(double f) { return (f > 0.0) ? (int)(f + 0.5) : (int)(f - 0.5); }
long binary(int n,int c)
在n > 1
时未返回值。怀疑是return binary(n/2,--c)
。
static long b=0;
是处理递归的错误方式。 long binary(int n,int c)
名义上只能正确运行一次。第二个电话b
不一定从0
开始。
鉴于pow()
片状,log2()
也可能需要特别小心。