我正在编写一些东西来分解训练网站上的二进制数字。我在我的本地编译器上测试了一百次,它运行得很好,但是训练网站告诉我有错误。
(我的代码也不优雅也没有效率,尤其是循环,但我分解了代码以了解错误的位置)。有人能告诉我是否有错误吗?
#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);
}
}
}
答案 0 :(得分: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;
}
答案 1 :(得分:1)
您需要包含数学库
#include <math.h>
答案 2 :(得分:1)
如前所述,您缺少数学库的包含:
#include <math.h>
此外,还有一个错误,即该程序不适用于输入“0”。
答案 3 :(得分: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中。