2016-10-04 3352 views
0

我编写了一个代码来获取C++中数字的阶乘。C++:如何使用cout正确输出long long int

这是代码。

#include <iostream> 

using namespace std; 

unsigned long long getFactorial(int); 

int main(int argc, char **argv) { 
     int num = 5; 
     unsigned long long factorial = getFactorial(a); 

     cout << "Factorial of " << num << ": " << factorial << endl; 

     return 0; 
} 

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

     return factorial; 
} 

当我给你5到num值,它正确地打印出正确的值,120。但是,当我给你更大的数字,例如100,它只是打印出0。我怎样才能修改代码来在控制台上正确输出结果?

+0

一个uint64_t(8字节)可以容纳93左右! 100!太简单了。尝试小于92 !,也许只能使用无符号长整数,无整数或有符号数。 –

+0

对于更大的阶乘,请查看gmp(扩展精度算术)。它可以处理1000 !,并产生一个大字符串作为结果。 –

+0

你是如何得出结论92的!可以适合一个64位整数?它不能。 20!是限制。 – paddy

回答

0

现在我自己找到了答案。

通过使用gmp库,处理大整数变得容易得多。

这是修改后的代码。

#include <iostream> 
#include <gmpxx.h> 

using namespace std; 

mpz_class getFactorial(int); 

int main(int argc, char **argv) { 
     int num = 100; 
     mpz_class factorial = getFactorial(num); 

     cout << "Factorial of " << num << ": " << factorial << endl; 

     return 0; 
} 

mpz_class getFactorial(int num) { 
     int i; 
     mpz_class factorial = 1; 
     for(i=1; i<=num; i++) { 
       factorial *= i; 
     } 

     return factorial; 
} 

为了使用gmp库,我包括<gmpxx.h>头文件。接下来,我将factorial变量的数据类型和getFactorial()函数的返回类型从unsigned long long更改为mpz_class,这是表示大整数的数据类型。

修改代码后,我使用以下标志使用GCC进行编译。

$gcc test.cpp -lstdc++ -lgmpxx -lgmp -o test

-lgmpxx-lgmp标志是必需使用gmp库来编译代码。

现在它工作正常。

+0

好东西......当你自己找到解决方案时,你会学到很多东西,恭喜! –