大量数字给出错误输出的阶乘

问题描述 投票:0回答:1

我正在尝试查找大量的阶乘

我输入了测试用例数

以及在每种情况下我要查找其阶乘的数字

我正在将阶乘的数字存储在向量中(动态数组)

并且每次将其乘以递减的n的值

功能显示:显示矢量v中的所有数字

#include <iostream>
#include <vector>

using namespace std;

void display(vector<int> v)
{
    for(int x : v)
    {
        cout << x;
    }
    cout << endl;
}


vector <int> factorial(int n)
{
    vector <int>v;
    if(n > 9)
    {
        int n1 = n;
        int r;
        while(n1 != 0)
        {
            r = n1 % 10;
            n /= 10;
            v.insert(v.begin(), r);
        }
    }
    else
    {
        v.push_back(n);
    }
    --n;
    int pdt;
    int carry = 0;
    int digit;

    while(n != 1)
    {
        for(int i = v.size() - 1; i >= 0; --i)
        {
            pdt = v[i] * n + carry;
            carry = pdt / 10;
            digit = pdt % 10;
            v.insert(v.begin() + i, digit);
            // display(v);
        }
        if(carry != 0)
        {
            if(carry > 9)
            {
                int n1 = n;
                int r;
                while(n1 != 0)
                {
                    r = n1 % 10;
                    n /= 10;
                    v.insert(v.begin(), r);
                }

            }
            else
            {
                v.insert(v.begin(), carry);
            }

        }
        carry = 0;
        --n;
    }

    return v;  
}

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >>n;
        vector <int> v;
        v = factorial(n);
        display(v);
    }
}

n = 5的输出

1264221101505

c++ stl factorial
1个回答
0
投票
代码中有几个问题。主要的一点是当前向量永远不会被修改:每次找到新的数字时,都会插入它。还有一个问题是使用一个变量而不是另一个变量。

此外,使用v[0]对应于LSB而不是MSB的约定,可以大大简化代码。>

也有可能通过避免无用的测试来简化代码,如if (n > 9 ....)

这里是工作代码:

#include <iostream> #include <vector> void display (std::vector<int> &v) { for (int i = v.size() -1 ; i >= 0; --i) { std::cout << v[i]; } std::cout << "\n"; } std::vector<int> factorial (int n) { std::vector<int> v; v.push_back(1); while (n != 1) { int carry = 0; for (int i = 0; i < v.size(); ++i) { int pdt = v[i] * n + carry; carry = pdt / 10; v[i] = pdt % 10; } while (carry != 0) { int r = carry % 10; carry /= 10; v.push_back(r); } --n; } return v; } int main() { int t; std::cin >> t; while (t--) { int n; std::cin >> n; auto v = factorial(n); display(v); } }

© www.soinside.com 2019 - 2024. All rights reserved.