-1

我正在尝试使用递归将十进制数转换为二进制数。但是我得到了错误的输出......我试图调试程序并被“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

为什么当 c=2 等于 99 时 binary() 中的“pow(10,c)”为什么不是 main() 中的 100?

4

3 回答 3

3

问题在这里:

(int)pow(10,c)

结果大约是 100,但(int)根据 的舍入误差,将它向下舍入可以得到 99 或 100 pow

这是一个方便的功能lroundmath.h应该可以帮助您。它将一个数字向最接近的整数四舍五入0.5,向零四舍五入。

或者,您可以定义:

int my_round(double f) {
    return (int)(f+0.5);
}

添加 0.5 并向下舍入看起来像四舍五入到最接近的整数。

于 2013-09-25T09:03:44.983 回答
1

pow() 函数是一个浮点函数,它往往会搞砸这些东西。如果没有适当的舍入来补偿,您不应该将它用于整数。

于 2013-09-25T08:58:38.490 回答
0

多个问题。

  1. 正如其他人指出的那样,结果pow(10,c)就是问题所在。一件商品 pow()准确返回100.0 pow(10,2)pow()可以合理预期int.

  2. 四舍五入是使用库函数的最佳处理。如果有人想自己动手:

    int IRound(double f) { return (f > 0.0) ? (int)(f + 0.5) : (int)(f - 0.5); }

  3. long binary(int n,int c)时不返回值n > 1。嫌疑人return binary(n/2,--c)被通缉。

  4. static long b=0;是处理递归 的不好方法。long binary(int n,int c)名义上只会正确运行一次。第二个电话,b不一定从0.

  5. Givenpow()是片状的,log2()可能也需要特别小心。

于 2013-09-25T13:22:21.833 回答