【发布时间】:2021-08-11 12:45:46
【问题描述】:
我写了一些 C++ 代码来找到 int n 的阶乘。由于阶乘可能是一个非常大的数字,所以我决定将数字存储在一个向量中。但我的代码没有按预期工作。有些人请指出错误并指导我。我低调的感觉就像我搞砸了指针。 请建议是否有更优化的方法。 感谢社区。p>
守则:
#include <iostream>
#include <vector>
#include <algorithm>
using std::cout;
using std::endl;
using Digits = std::vector<int>;
//define the length of the array, should be the maximum number of digits in the factorial(n)
#define MAX 20
void multiply(int x,Digits res,int res_size){
int carry=0;
for(int i=0;i<res_size;i++){
int prod=carry+ x*res[i];
res[i] = prod%10;
carry = prod/10;
}
while(carry){
res[res_size] = carry%10;
carry/=10;
(res_size)++;
}
}
Digits factorial(int n){
Digits res(MAX);
res[0] = 1;
int res_size=1;
for(int i=2;i<=n;i++){
multiply(i,res,res_size);
}
reverse(res.begin(),res.end());
return res;
}
int main(){
for(auto i: factorial(20)){
cout << i;
}cout << endl;
return 0;
}
输出:
10000000000000000000
[Done] exited with code=0 in 3.204 seconds
【问题讨论】:
-
multiply通过值而不是引用来获取其参数res。当您在factorial中调用它时,它会作用于res的副本,而原始文件保持不变。 -
那么,解决方案是什么,如何通过引用传递 res?
-
(*res_size)++;这不会影响res的大小,所以它仍然会很快越界。顺便说一句,10000000000000000000!大约有 1.8×10^20 位数。这比您的计算机可能支持的要多一点。 -
10000000000000000000 不是我所说的,是上面代码的输出。并且
(*res_size)++;不能超出界限,因为它明确检查了 MAX 是一个非常大的数字,并且约束限制中的阶乘允许的最大位数。谢谢你的建议。