トピックの説明:
入力数nの階乗を計算します
アルゴリズムのアイデア:
- 配列の長さの計算:double s = log2 +…logn、m =(int)s + 1
for(int i=2;i<=n;i++)
s += log10(i);
m = (int)s+1;
- 初期化:a [1] = 1を割り当て、残りの値は0です
for(int k=1;k<=m;k++)
a[k]=0;
a[1] = 1; // 个位为1
- 多数の計算:abc d =(a + b + c)d = a d + b d + c * d
for(int i=2;i<=n;i++)
for(int j=1;j<=m;j++){
int t = a[j]*i + carry;
a[j] = t % 10;
carry = t/10;
}
完全なコード:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1e5;
int a[N],n,carry,m;
double s;
int main(){
cin>>n;
// 计算长度
for(int i=2;i<=n;i++)
s += log10(i);
m = (int)s+1;
// 初始化
for(int k=1;k<=m;k++)
a[k]=0;
a[1] = 1;
// 开始计算
for(int i=2;i<=n;i++)
for(int j=1;j<=m;j++){
int t = a[j]*i + carry;
a[j] = t % 10;
carry = t/10;
}
printf("m=%d\n",m);
printf("%d!=",n);
for(int i=m;i>=1;i--)
cout<<a[i];
cout<<endl;
return 0;
}