这在javascript中给出了73014902784
cs = [ 4, 4, 4, 8, 9];
var v, i, o, s = 1<<cs[0]|1<<cs[1]|1<<cs[2]|1<<cs[3]|1<<cs[4];
for(i=-1, v=o=0; i<5; i++, o=Math.pow(2,cs[i]*4)){
v += o*(((v/o)&15)+1);
}
因为c ++不处理除零,所以我写了一个除法函数
int divide(int a, int b)
{
if (b == 0)
{
return 0;
}
return a / b;
}
int v, i, o, s = 1 << cs[0] | 1 << cs[1] | 1 << cs[2] | 1 << cs[3] | 1 << cs[4];
for (i = -1, v = o = 0; i < 5; i++, o = pow(2, cs[i] * 4)) {
v += o*((divide(v,o) & 15) + 1);
}
但这给了我458752.为什么会这样?已经检查了一百万次。
答案 0 :(得分:1)
我怀疑你的问题是JavaScript代表64位浮点格式的所有数字,而你的C ++变量都定义为(大概是16位)int。
答案 1 :(得分:0)
JavaScript在计算上是错误的,你的C ++ divide
函数也是错误的。
C ++没有处理除零的原因,这很棘手。无限不是一个数字,它是一个概念,一些数学运算不适用它。
按位运算符&
是一个很好的例子,因为无穷大是任意定义的(浮点数类似零),按位的结果也是任意的。
将无穷大视为一个非常大的 事物 (不是数字!)而且你不知道完全那是什么东西。也就是说,你取一个数字除以一个非常小的数字,它应该给你一个非常大的东西,但你没有真正的代表。