我有一个非常长的因子程序,需要找到最多100的阶乘。它可以很好地工作到33阶乘但不能从34阶段。有人可以帮助找出问题。
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
void bigFactorials(int n)
{
vector<int> v;//If I specify the size as v(1000) it works fine but I don't
//want to specify the size beforehand.
v.push_back(1);
// Complete this function
for(int i=2;i<=n;i++) {
int carry = 0, mul=0;
for(auto j=v.rbegin();j!=v.rend();j++) {
mul=i**j + carry;
carry=mul/10;
*j=mul%10;
}
if(carry)
v.insert(v.begin(),carry);
}
for(int i:v)
cout<<i;
}
int main()
{
int n;
cin >> n;
if( n>0 && n<101 )
bigFactorials(n);
return 0;
}
答案 0 :(得分:2)
问题是携带时> 10,然后你插入一个整数值而不将它分成字符,它应该实现如下
if(carry)
{
if (carry >= 10)
{
while (carry > 0)
{
v.insert(v.begin(),carry % 10); // put each char from carry into v
carry = carry / 10;
}
}
else
v.insert (v.begin(),carry);
}
有了这个,您甚至可以将v
保留为vector<char>
并保持为50!我们有
30414093201713378043612608166064768844377641568960512000000000000。
答案 1 :(得分:1)
当我打印出添加到矢量中的carry
值时,你肯定会溢出:
1
5
4
3
3
3
4
6
8
13
20
35
64
121
243
510
1124
2585
6204
15511
40329
108888
304888
884176
2652528
8222838
26313083
86833176
-134263930
-134263930-639604140847618609643520000000
我为long long
和carry
以及mul
切换到了subjectLabel.text = NSLocalizedString(@"Kind Information", @"Info Label");
,并且能够得到34的正确答案!但是99!仍然溢出。似乎您需要进一步减少要添加到矢量的数字。
答案 2 :(得分:0)
您需要将您的carry
拆分为十进制数字并插入 BigInt 的前面。
while (carry)
{
v.insert(v.begin(), carry % 10);
carry /= 10;
}
这里的整个功能:
void bigFactorials(int n) {
vector<int> v;//If I specify the size as v(1000) it works fine but I don't
//want to specify the size beforehand.
v.push_back(1);
// Complete this function
for (int i = 2; i <= n; i++)
{
int carry = 0, mul = 0;
for (auto j = v.rbegin(); j != v.rend(); j++)
{
mul = i * *j + carry;
carry = mul / 10;
*j = mul % 10;
}
while (carry)
{
v.insert(v.begin(), carry % 10);
carry /= 10;
}
}
for (int i : v)
cout << i;
}