九度OJ 1076 N的阶乘 (高精度大数的乘法)

时间:2022-12-03 03:36:21
题目描述:

 输入一个正整数N,输出N的阶乘。

输入:

正整数N(0<=N<=1000)

输出:

 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘

样例输入:
4
5
15
样例输出:
24
120
1307674368000
来源:
2006年清华大学计算机研究生机试真题
/*与九度OJ 1198 相比较,使用了相同的套路*/
#include <stdio.h>
using namespace std;

struct bigInteger{
int digit[1002];
int size;
//初始化结构体
void init() {
for(int i=0;i<1002;i++) {
digit[i] = 0;
}
size = 0;
}
//用一个小整数设置高精度整数
void set(int x) {
init(); //先进行初始化
do{
digit[size++] = x%10000;
x /= 10000;
}while(x!=0);
}

//输出高精度整数
void output() {
for(int i=size-1;i>=0; i--) {
if(i!=size-1) {
printf("%04d", digit[i]);
}else {
printf("%d", digit[i]);
}
}
printf("\n");
}

//重载*运算符
bigInteger operator * (int x) const {
bigInteger ret; //返回的结构体变量
ret.init(); //初始化
int carry = 0; //记录进位

//每四位进行一次处理
for(int i=0;i<size;i++) {
int tmp = x*digit[i] + carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if(carry != 0) {
ret.digit[ret.size++] = carry;
}
return ret;
}
};

bigInteger a;

int main()
{
int n;
while(scanf("%d", &n) != EOF) {
a.init();
a.set(1); //a初始化为1,即1存入高精度结构中
for(int i=1;i<=n;i++) { //注意不能从0开始循环
a = a*i;
}
a.output();
}
return 0;
}