题目描述
给定一个数N(0<=N<=10000),计算N!
输入描述
多个测试数据,每次输入一个测试数据
输出描述
每组用一行输出N!、
示例
输入
1
2
3
输出
1
2
6
问题分析
第一次刚看到题的时候,感觉超级简单。试着写了写后,发现每次才通过20%的case。后来,想一想发现应该是溢出的问题。、
再后来,在网上搜了搜高精度相关的计算方法。以及看了些大佬写的代码,当然在这个过程中,也发现好多代码虽然看起来懂了
这种思想,但是代码的结果输出有错误。
这个问题你首先得了解高精度的计算,其次要了解高精度计算中进位的处理应该是先做运算,然后再判断进位。
code(上代码)
#include<iostream>
using namespace std;
const int length=100000;//这个值经过多次调整,才过了10000!
int main()
{
int a[length];//定义一个数组来存储结果
for(int i=0; i<length; i++)//将数组中所有元素置为0;
a[i]=0;
a[0] = 1;//首位置为1;
int n;
cin>>n;//输入要计算阶乘的数
for(int i=2; i<=n; i++)
{//开始计算阶乘
int jinwei = 0;
int j =0;
int temp;
while(j<length)
{//考虑进位及进位的处理
temp = jinwei;
jinwei = (a[j]*i+jinwei)/10;
a[j] = (a[j]*i + temp)%10;
j++;
}
}
int k=length-1;
while(!a[k])
{//将为0的数全跳过,不输出
k--;
}
while(k>=0)
{//输出正确的阶乘结果
cout<<a[k];
k--;
}
return 0;
}