0

我正在编写一些代码以在培训站点上以二进制形式分解数字。我已经在我的本地编译器上测试了一百次,它工作得很好,但是培训网站告诉我有错误。

(我的代码既不优雅也不高效,尤其是循环,但我分解了代码以了解错误可能在哪里)。谁能告诉我是否有错误?

#include <stdio.h>
#include <stdlib.h>


//function that displays the greatest power of 2 less than a fixed number N
int residu(int N)

{
    int i;
    int M=2;
    for(i=0;i<N;i++){
        if(M>N){break;}else{M=2*M;i++;}
    }
    return M/2;
}


int main()
{
    int i;

    //N is the input to decompose
    int N;
    scanf("%d",&N);
    //We will search for the greatest power of 2 less than a fixed number N, 
    //than repeating the some process with the residue of N with the greatest power of 2        //less than N, so we have to store the value of N for the loop (see below) we will use to work //correctly
    int M;
    M=N;
    //D displays the diffrence betwenn two successive powers of 2 that appears in the    //binary decomposition, (we will then print "O")
    int D;
    D=log(residu(N))/log(2);

        for(i=0;i<M;i++){
            //If N==residu(N), the decomposition is finished
            if(N==residu(N)){printf("1");int k;
                for(k=0;k<D;k++){printf("0");}break;}
            else{
             // N is a the residue of the former value of N and the greatest power of 2 //less than N
                N=N-residu(N);
                D=D-log(residu(N))/log(2);
                printf("1");
                int k;
                for(k=0;k<D-1;k++){printf("0");
                }
                D=log(residu(N))/log(2);
            }        
    }
}
4

4 回答 4

5

这是浮点计算的典型问题。该函数log适用于浮点数。

log(8) / log(2)正在计算2.999...,然后2在转换为时截断为int.

这就是为什么你得到错误的结果。确切的行为取决于编译器/机器。如需进一步阅读,请参阅Goldberg等。

以这种方式混合整数和浮点计算通常是一个坏主意。您的函数residu应该报告准确的二进制对数。或者你实现了一个专门的函数来计算整数的日志,比如

unsigned binlog(unsigned n) {
    unsigned i = 0;
    while (n > 1) { n /= 2; ++i; }
    return i;
}
于 2012-09-07T11:24:43.007 回答
1

您需要包含数学库

#include <math.h>
于 2012-09-07T10:51:37.100 回答
1

如前所述,您缺少数学库的包含:

#include <math.h>

此外,还有一个错误是该程序不适用于输入“0”。

于 2012-09-07T11:03:50.087 回答
0

尝试以下修复:

1) 为日志函数包含 math.h

#include <math.h>

2)在每个函数的顶部(或在每个函数内的每个作用域的顶部)声明所有变量,即:

int main() {  
int i;      
//N is the input to decompose
int N;
int M;
//D displays the diffrence betwenn two successive powers of 2 that appears in the
//binary decomposition, (we will then print "O") 
int D;
...
if(N==residu(N)){int k;printf("1");
...
else{  
   int k; 

3)从main中返回一些东西。它的返回类型是“int”,所以添加一个

return 0;

4)如果仍然不这样做,您可以尝试显式类型转换这些语句的返回:

D=log(residu(N))/log(2);
D=D-log(residu(N))/log(2);
D=log(residu(N))/log(2);

他们会发出警告,表示数据丢失会导致双重结果并将其存储在 int 中。

于 2012-09-07T11:12:26.757 回答