无法在输出屏幕上使用 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
好吧,我在这个问题上卡住了很长一段时间:
问题: 你被要求计算一些小的正整数的阶乘。
输入:
一个整数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