これら 2 つのコード ブロックは、理論的には、2 つの異なる言語で実装されたばかりの同じことを行うはずです。しかし、それらはまったく異なる出力を生成します。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
.