九度OJ-1076:N的阶乘

  本题是高精度整数乘法的第一题。且藉由此题复习了一下类及其成员函数的定义、运算符重载等已经忘了的基础知识 = =

  代码的关键在于逐单元的算法。即乘完本单元就取模并进位。其他的代码与高精度整数加法相似。

收获如下:

  ①构造函数只有在声明的时候调用,不能把声明与用构造函数初始化分开来。若要在声明之后初始化,应该另外定义一个init函数。

  ②const成员函数中不允许修改调用该函数的对象的成员变量,且在该const函数中this对象调用的成员函数必须是const函数(构造函数、复制构造函数除外)

 

题目描述:

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

输入:

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

输出:

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

样例输入:
4
5
15
样例输出:
24
120
1307674368000
来源:
2006年清华大学计算机研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7799-1-1.html

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值