无法在输出屏幕上使用 C++ 进行 100 阶乘(显示 0)

Unable to have 100 factorial with C++ on output screen(displaying 0)

好吧,我在这个问题上卡住了很长一段时间:

问题: 你被要求计算一些小的正整数的阶乘。


输入:

一个整数t,1<=t<=100,表示测试用例的数量,后面是t行,每行包含一个整数n,1<=n<=100。


输出:

对于输入中给定的每个整数 n,显示一行包含 n 的值!

//coded in c++
#include <bits/stdc++.h> //loadind up all the libraries at once.
using namespace std;

int main()
{   int T;
    scanf("%d", &T); 

//I am not doing "cin<<" cause "scanf" is faster than it

    for (int i = 0; i < T; i++)
    {
        int N;
        scanf("%d",&N);
        long long int product = 1;
        while (N >0){
            product = product * N;
            N--;
        }
        printf("%lld\n",product);
    }    
    return 0;
}

我能得到10!,20!但无法获得100! (阶乘) 所以极端情况不满足。请帮助我为我的变量获取一个好的数据类型 100!阶乘的位数超过 100 位。我在终端输入100显示0.

P.S - 此问题来自 CodeChef 网站 (FCTRL2)。

64 位整数会溢出 23!

因此你需要用数字和向量来完成。

这是一项相当简单的任务。我们可以像在一张纸上那样做。我们使用 std::vector 个数字来保存数字。因为结果对于 unsigned long long for 23!.

来说已经太大了

答案将是准确的。

采用这种方法计算起来很简单。我什至不知道该解释什么。

请看代码:

#include <iostream>
#include <vector>

int main()
{
    std::cout << "Calculate n!   Enter n (max 10000): ";
    if (unsigned int input{}; (std::cin >> input) && (input <= 10000)) {

        // Here we store the resulting number as single digits
        std::vector<unsigned int> result(3000, 0);  // Magic number. Is big enough for 100000!
        result.back() = 1;                          // Start calculation with 1 (from right to left)

        // Multiply up to the given input value
        for (unsigned int count = 2; count <= input; count++)
        {
            unsigned int sum{}, remainder{};
            unsigned int i = result.size() - 1;     // Calculate from right to left
            while (i > 0)
            {
                // Simple multiplication like on a piece of paper
                sum = result[i] * count + remainder;
                result[i--] = sum % 10;
                remainder = sum / 10;
            }
        }
        // Show output. Supporess leading zeroes
        bool showZeros{ false };
        for (const unsigned int i : result) {
            if ((i != 0) || showZeros) {
                std::cout << i;
                showZeros = true;
            }
        }
    }
    else std::cerr << "\nError: Wrong input.";
}

使用 bigint 库会快得多。


使用 Microsoft Visual Studio Community 2019 版本 16.8.2 开发和测试。

另外用clang11.0和gcc10.2编译测试

语言:C++17