-
本题是高精度整数乘法的第一题。且藉由此题复习了一下类及其成员函数的定义、运算符重载等已经忘了的基础知识 = =
-
输入一个正整数N,输出N的阶乘。
-
正整数N(0<=N<=1000)
-
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
-
4 5 15
-
24 120 1307674368000
- 解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7799-1-1.html
代码的关键在于逐单元的算法。即乘完本单元就取模并进位。其他的代码与高精度整数加法相似。
收获如下:
①构造函数只有在声明的时候调用,不能把声明与用构造函数初始化分开来。若要在声明之后初始化,应该另外定义一个init函数。
②const成员函数中不允许修改调用该函数的对象的成员变量,且在该const函数中this对象调用的成员函数必须是const函数(构造函数、复制构造函数除外)
-
题目描述:
-
输入:
-
输出:
-
样例输入:
-
样例输出:
-
答疑:
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
struct BigInteger{
int digit[1000];
int size;
BigInteger();
void initInteger();
void char2Integer(char *);
void int2Integer(int );
void printInteger();
BigInteger operator* (const int) const;
};
BigInteger::BigInteger(){
initInteger();
}
void BigInteger::initInteger(){
size=0;
for (int i=0;i<1000;i++){
digit[i]=0;
}
}
void BigInteger::char2Integer(char *s){
initInteger();
int weight,temp;
for (int i=strlen(s)-1;i>=0;i-=4){
weight=1;
temp=0;
for (int j=i;j>i-4&&j>=0;j--){
temp+=(s[j]-'0')*weight;
weight*=10;
}
digit[size]=temp;
size++;
}
}
void BigInteger::int2Integer(int x){
initInteger();
while (x>0){
digit[size]=x%10000;
size++;
x/=10000;
}
}
void BigInteger::printInteger(){
setfill('0');
for (int i=size-1;i>=0;i--){
cout<<setfill('0')<<setw(i==size-1?0:4)<<digit[i];
}
cout<<endl;
}
BigInteger BigInteger::operator* (const int x) const{
BigInteger bInt;
int c=0;
for (int i=0;i<size;i++){
bInt.digit[i]=digit[i]*x;
bInt.digit[i]+=c;
c=bInt.digit[i]/10000;
bInt.digit[i]%=10000;
}
bInt.size=size;
while (c>0){//solve the c
bInt.digit[bInt.size]=c%10000;
bInt.size++;
c/=10000;
}
return bInt;
}
int main(){
int n;
BigInteger aInt;
while (cin>>n){
aInt.int2Integer(1);
for (;n>0;n--){
aInt=aInt*n;
}
aInt.printInteger();
}
return true;
}