题目描述
知识点
高精度整数与低精度整数的乘法
结果
实现
码前思考
- 虽然这是阶乘的问题,但是我们可以将其转换成高精度整数的乘法问题
代码实现
//高精度整数与低精度数的乘法
#include "bits/stdc++.h"
using namespace std;
//估摸着位数的极限就是3000啦
const int maxn = 3000;
struct bign{
int d[maxn];
int len;
bign(){
memset(d,0,sizeof(d));
len = 0;
}
};
bign multi(bign a,int b){
bign c;
int carry = 0;
for(int i=0;i<a.len;i++){
int ans = b * a.d[i] + carry;
carry = ans / 10;
c.d[c.len++] = ans % 10;
}
while(carry != 0){
c.d[c.len++] = carry % 10;
carry = carry / 10;
}
return c;
}
int main(){
int n;
while(~(scanf("%d",&n))){
if(n==0){
return 1;
}else{
bign c;
c.len = 1;
c.d[0] = 1;
for(int i=n;i>=2;i--){
c = multi(c,i);
}
for(int i=c.len-1;i>=0;i--){
printf("%d",c.d[i]);
}
}
printf("\n");
}
return 0;
}
码后反思
- 注意要在
multi()
函数最后保留下进位,而且进位不一定是个位数,因此要循环!