为什么C ++中的vector不会自动调整大小

时间:2018-02-15 07:20:40

标签: c++ c++11 vector factorial

我有一个非常长的因子程序,需要找到最多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;
}

3 个答案:

答案 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 longcarry以及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;
}

Live Demo