一个谜语:
您有3个目录。每个都包含2个目录。每个目录都包含1个目录,这些目录都是空的。你有几个目录?
我写了一个JavaScript函数来解决它......
NAs
...并返回正确的结果:
function catalogsNumber(c)
{
n = 0;
for (a = 0; a < c; a++) {
n = (n + 1) * (a + 1);
}
return n;
}
但是当我在C ++中尝试相同时,每当// Results in JavaScript
catalogsNumber ( 3 ) => 15
catalogsNumber ( 4 ) => 64
catalogsNumber ( 5 ) => 325
catalogsNumber ( 12 ) => 1302061344
catalogsNumber ( 13 ) => 16926797485
catalogsNumber ( 14 ) => 236975164804
时,该函数都会返回奇怪的结果:
c > 12
这样的谜语,非常神秘。为什么会这样?
答案 0 :(得分:2)
这是一个溢出:当用13调用时,结果不适合你的int
变量。
答案 1 :(得分:1)
问题是你溢出了int
变量n,其最大值为2,147,483,647。
您需要使用更广泛的类型。您可以使用unsigned int
类型,这会使您的最大值翻倍,但在这种情况下这不会有太大帮助。因此最好使用64位整数。
uint64_t catalogsNumber(int c)
{
int i=0;
uint64_t n = 0;
for (i = 0; i < c; i++) {
n = (n + 1) * (i + 1);
}
return n;
}
答案 2 :(得分:0)
有溢出。您试图在整数处存储一个大于整数可以容纳的值的值。 javascript是有效的,因为它是一种无类型语言,所以你不要声明输出变量的类型,编译器找到自己并分配所需的内存。 要解决这个问题,在c / c ++中,你应该将变量声明为long或long long。 希望有所帮助:)
答案 3 :(得分:-1)
将i更改为short并将结果设为uint64_t,这样就不会出现溢出异常。您不能将值16926797485存储在int
中int catalogsNumber(int c)
{
// Change to long int instead of int or some other bigger datatype,
// the value can't be stored inside an int
short i = 0;
uint64_t int n = 0;
for (i = 0; i < c; i++) {
n = (n + 1) * (i + 1);
}
return n;
}