这两个代码块理论上应该做同样的事情,只是用两种不同的语言实现。但它们产生完全不同的输出。C++ 产生了预期的结果,而 ruby 输出甚至没有接近。
C++
unsigned long MEMO[10][10][21];
long generate(int a, int b, int l){
if(MEMO[a][b][l] != 0){
return MEMO[a][b][l];
}
if(l==0){
return 1;
}
for(int i =0; i<=9-a-b; i++){
MEMO[a][b][l] += generate(b, i, l-1);
}
return MEMO[a][b][l];
}
int main(){
unsigned long sum = 0L;
for(int i=1; i<10; i++){
sum += generate(0,i,19);
}
printf ("Answer: %lu\n",sum);
return 0;
}
红宝石
MEMO = Array.new(10, Array.new(10, Array.new(21, 0)))
def generate a, b, l
if MEMO[a][b][l] != 0
return MEMO[a][b][l]
end
if (l==0)
return 1
end
0.upto(9-a-b).each do |i|
MEMO[a][b][l] += generate(b, i, l-1)
end
MEMO[a][b][l]
end
sum = 0
1.upto(9).each do |i|
sum+= generate(0, i, 19)
end
puts sum
红宝石输出:72900000000000000000
C++ 输出:378158756814587
有谁知道这可能是为什么?
编辑:
以防万一这不清楚, 378158756814587 是我想要的答案,这是我期望 ruby 代码产生的。它不是 C++ 端的整数溢出。378158756814587 仍然是使用unsigned long long
.