王道機試験練習——高精度Nの階乗
11139 ワード
王道機試験練習——高精度Nの階乗
タイトルの説明
正の整数Nを入力し、Nの乗算を出力します.入力:正整数N(0<=N<=1000)出力:入力は複数組のデータを含む可能性があり、各組の入力データに対して、Nの階乗を出力する
テーマを考える
この例では、入力されたデータは大きくないが、計算結果は非常に大きい(1000!)可能性があるため、高精度整数を用いて計算を完了する必要がある.この例に係る高精度演算は、高精度乗算である.
コード#コード#
タイトルの説明
正の整数Nを入力し、Nの乗算を出力します.入力:正整数N(0<=N<=1000)出力:入力は複数組のデータを含む可能性があり、各組の入力データに対して、Nの階乗を出力する
テーマを考える
この例では、入力されたデータは大きくないが、計算結果は非常に大きい(1000!)可能性があるため、高精度整数を用いて計算を完了する必要がある.この例に係る高精度演算は、高精度乗算である.
コード#コード#
#include
#include
#include
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("
");
}
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;
}