问题:4 大阶乘计算
问题描述:
输入一个正整数n,输出n!的值。
其中n!=123*…*n。
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。
参考算法:
使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入说明 :
输入包含一个正整数n,n<=1000。
输出说明 :
输出n!的准确值。
输入范例 :
10
输出范例 :
3628800
思路:
说来惭愧,这是基础原题,第一次见到一直想用字符串解决,后来做不出来就放在那了
这次又出现提示用int数组存储一下豁然开朗
本质就是每个数乘的时候把vector中每个数从高位到低位依次拿出来乘一下,再判断进位进了多少
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int N;
while(cin>>N)
{
if(N==0)
{
cout<<0<<endl;
continue;
}
else if(N==1)
{
cout<<1<<endl;
continue;
}
vector<int> vec;
vec.push_back(1);
int zeroIndex=-1;
for(int i=2;i<=N;i++)
{
for(int j=vec.size()-1;j>=zeroIndex+1;j--)
{
int temp=vec[j]*i;
int enterBits=0;
if(temp<10)
{
vec[j]=temp;
}
while(temp>=10)
{
vec[j+enterBits]=temp%10;
if(j+1+enterBits<vec.size())
{
vec[j+1+enterBits]+=temp/10;
temp=vec[j+1+enterBits];
}
else
{
vec.push_back(temp/10);
temp/=10;
}
enterBits++;
}
}
for(int j=zeroIndex+1;j<vec.size();j++)
{
if(vec[j]==0) zeroIndex++;
else break;
}
}
int len=vec.size();
for(int i=0;i<len;i++)
{
cout<<vec[len-1-i];
}
cout<<endl;
}
}