王道机试练习——高精度N的阶乘
题目描述
输入一个正整数 N,输出 N 的阶乘。
输入: 正整数 N(0<=N<=1000)
输出: 输入可能包括多组数据,对于每一组输入数据,输出 N 的阶乘
题目思考
本例中,虽然输入的数据并不大,但是计算的结果却可能非常的大( 1000!), 所以我们依旧需要利用高精度整数来完成计算。本例中涉及的高精度运算即是高 精度乘法。
代码
#include<iostream>
#include<stdio.h>
#include<string>
struct bigInteger {
int digit[1000];
int size;
void init() {//初始化
for (int i = 0; i < 1000; i++) digit[i] = 0;
size = 0;
}
void set(int x) {//用一个小整数设置高精度整数
init();
do {//对小整数4位为一个单位分解依次存入digit中
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;//初始化进位值为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;//返回结果
}
}a;
int main() {
int n;
while (scanf("%d", &n) != EOF) {
a.init();
a.set(1);
for (int i = 1; i <= n; i++) {
a = a * i;//依次乘上每一个整数
}
a.output();//输出a
}
return 0;
}