2014-02-11 50 views
-2

有人可以帮我理解为什么这段代码工作不正常吗?我知道它非常接近,我认为我只是忽略了一些东西。任何帮助表示赞赏。这是我到目前为止:C++析因函数不起作用

#include <iostream> 
    #define TEST_ARRAY_SIZE 4 

    long int factorial(int num); 

    long int factorial(int num){ 
     for(unsigned int i = 1; i <= num; i++) { 
     num *= i; 
     } 
      return num; 
    } 

    int main() { 
     int test[TEST_ARRAY_SIZE] = {1, 2, 5, 7}; 
     for (unsigned int i = 0; i < TEST_ARRAY_SIZE; i++) { 
      std::cout << "Factorial of " << test[i] << " is " << factorial(test[i]) << std::endl; 
     } 
     return 0; 
    } 
+1

您可能会尝试将'return'移到循环外。修复缩进将有助于使这一点更加明显。但是这也会使你的循环无限,因为你正在修改你用作循环终止的变量。 –

回答

1

您应该移动return num;以外的循环。就像现在一样,控制总是在第一个数字相乘后返回。

- 正确的代码 -

long int factorial(int num){ 
    long int res = 1; 
    for(unsigned int i = 1; i <= num; i++) { 
    res *= i; 
    } 
return res; 
} 
+0

我这样做了,但它仍然没有输出正确的答案。 – user3251244

+0

请参阅更新。只是一些小的细节。 – tinlyx

0

这只是问题的一部分;这是一个适当的缩进会立即使bug出现的情况。

除此之外,为什么你在循环中使用num?您应该保持原样并声明一个新变量来复合并返回结果。

long int factorial(unsigned int num) { 
    int x = 1; 

    for(unsigned int i = 1; i <= num; i++) { 
     x *= i; 
    } 

    return x; 
} 

其他注意事项:

  • 你不应该使用的#define;你应该声明一个const。
  • 您正在比较unsigned与signed()for循环中的signed。
1

阶乘函数的主体不正确。您可以使用递归方法来计算特定数字的阶乘。正确的程序版本如下:

#include <iostream> 
    #define TEST_ARRAY_SIZE 4 

    long int factorial(int num); 

    int main() { 

     int test[TEST_ARRAY_SIZE] = {1, 2, 5, 7}; 

     for (unsigned int i = 0; i < TEST_ARRAY_SIZE; i++) { 
      std::cout << "Factorial of " << test[i] << " is " << factorial(test[i]) << std::endl; 
     } 

     return 0; 
    } 

    long int factorial(int num){ 
     if (num == 1) 
      return num; 
     else 
      return num * factorial(num-1); 
    }