//又优化了了一次,感觉简单多了!!!
基础练习 阶乘计算
时间限制:1.0s 内存限制:512.0MB
问题描述
输入一个正整数
n,输出
n!的值。
其中 n!=1*2*3*…* n。
其中 n!=1*2*3*…* n。
算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组
A来表示一个大整数
a,
A[0]表示
a的个位,
A[1]表示
a的十位,依次类推。
将 a乘以一个整数 k变为将数组 A的每一个元素都乘以 k,请注意处理相应的进位。
首先将 a设为1,然后乘2,乘3,当乘到 n时,即得到了 n!的值。
将 a乘以一个整数 k变为将数组 A的每一个元素都乘以 k,请注意处理相应的进位。
首先将 a设为1,然后乘2,乘3,当乘到 n时,即得到了 n!的值。
输入格式
输入包含一个正整数
n,
n<=1000。
输出格式
输出
n!的准确值。
样例输入
10
样例输出
3628800
我的程序:
#include <iostream>
using namespace std;
// A[0]存放位数 初始为1
int A[10000]={1,1};//A[1]初始也为1
int dfs(int n){int temp;//起到暂存的作用
int i=2;//跳着乘i直到n
while(i<=n){
int j=1;
while(j<=A[0]){A[j]*=i;j++; }//每位乘j到最高位
//开始处理进位 n最大1000,所以最多进四位
j=1;
while(j<=A[0]+3){temp=A[j];
if(temp<10) {j++;continue;}//1位
else if(temp<100){A[j]=(temp%10); A[j+1]+=temp/10;}//2位
else if(temp<1000){A[j]=temp%10;A[j+1]+=(temp/10%10);A[j+2]+=temp/100;}//3位
else {A[j]=temp%10;A[j+1]+=(temp/10%10);A[j+2]+=(temp/100%10);A[j+3]+=temp/1000;}//4位
j++;
} j+=3;
//判断现在的位数:
while(A[j]==0){j--;} A[0]=j;
i++;
}
for(i=A[0];i>=1;i--) cout<<A[i]; //输出
}
int main()
{int n;
cin>>n; //n<1000;
if(n<=0) return 0;
dfs(n);
return 0;
}