当前位置: 首页 > 知识库问答 >
问题:

阶乘用于给出错误输出的大数

仲阳朔
2023-03-14

我试图找到大数的阶乘

我输入t个测试用例

每种情况下都有一个数字,我试图找到它的阶乘

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

每次乘以递减的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

共有1个答案

蒯嘉赐
2023-03-14

代码中有几个问题。最主要的一点是,电流矢量永远不会被修改:每次找到一个新的数字,它就会被插入。还存在使用一个变量而不是另一个变量的问题。

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

还可以通过避免无用的测试来简化代码,如if(n

这是一个工作代码:

#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);
    }
}

 类似资料:
  • 问题内容: 我正在使用Python编写一些加密算法,但是我以前从未使用过Python。 首先,看一下这段代码,然后我将解释这个问题, x和y的值为, 我不明白代码的第三行。为了理解第三行,我不得不研究函数,我遇到了这个问题, zip函数帮助元组 根据这个问题的答案,代码, 将输出, 但是当我尝试打印时, 我得到这个输出, 为什么我的输出与原始输出不同? 问题答案: 在Python 3中返回一个迭代

  • 下面是一个小代码,我正试图计算softmax。它适用于单个阵列。但是如果数量更大,比如1000等,就会爆炸 我收到一个错误 运行时警告: 在 exp 中遇到溢出 运行你的代码 softmax1 = np.exp(x)/np.sum(np.exp(x))

  • 我试图根据用户使用calandar类输入的日期来确定一天是否是周末。但是当我打印出当天的值时,我得到了不正确的输出。 这是我的代码: 但是输出

  • 我正在spoj平台上解决任务-计算阶乘中的位数。我找到了Kamenetsky公式并实现了它: 首先,我使用了注释代码(流),因为我认为它比实际代码(没有注释)慢,所以我做了更改,但仍然超过了时间限制。我怎样才能更快? 示例输入为(第一行是测试数): 和预期产出:

  • 我正在尝试通过使用if else条件在我的代码中的textbox上添加验证 我在textbox上添加了focusListener,当我从textbox中删除焦点时,它将检查条件 我还在chekbox旁边创建了一个标签,它将根据条件显示文本 如果textbox中的文本不等于“Hi”,则应在textbox旁边的标签中打印“Hello 否则应打印“再见” 请帮忙

  • 我试图计算整数范围的阶乘(2 然而,上面的print语句给出的值=0。事实上,对于所有n