POJ 1001 Exponentiation

这题算是一道入门模拟题吧,要自己手写高精度浮点数,对输出格式还有一定的要求,还要写一个阶乘函数,要求有点多啊~

其实,你看她第一眼——你已经知道算法了吧!一个高精度整数加上单独的浮点处理加上二分法求阶乘加上格式化输出,总的来说

都是靠我们耐心的吧!感觉手不是自己的了。废话不多说,上代码

//PKU_1001
//高精度浮点数类及其乘法运算

#include <iostream>
using namespace std;

class mFloat{
private:
public:
	int num[200];	<span style="white-space:pre">		</span>//有200位十进制数
	int length;			//最高有效位
	int point;			//小数点位置
	//数字采用逆序存储

	//构造空白高精度浮点数
	mFloat(){
		for (int i=0;i<160;i++)
			num[i]=0;
		length=0;
		point=0;
	}

	//以字符形式读入高精度浮点数
	bool read(){
		char ch;
		do{
			ch=getchar();
			if (ch==-1) 
				return false;
		}
		while (ch==' ' || ch=='\n');

		length=0;	point=-1;
		while (ch!=' ' && ch!='\n'){
			if (ch>='0' && ch<='9'){
				num[length]=int(ch)-48;
				length++;
			}
			else if (ch=='.')	point=length;
			ch=getchar();
		}
		if (point==-1) point=length;
		
		for (int i=0;i<length/2;i++){
			int temp;
			temp=num[i];
			num[i]=num[length-i-1];
			num[length-i-1]=temp;
		}
		point=length-point;

		while (num[length-1]==0)	length--;
		while (num[0]==0 && point!=0){
			for (int i=1;i<length;i++)
				num[i-1]=num[i];
			point--;
			length--;
		}

		return true;
	}

	//输出高精度浮点数
	void write(){
		int i;
		//输出整数部分
		for (i=length-1;i>=point;i--)
			cout<<num[i];
		if (point)
			cout<<'.';
		for (i=point-1;i>=0;i--)
			cout<<num[i];
		cout<<endl;
	}

	//重载*运算符
	mFloat operator * (mFloat r){
		mFloat result;
		int i,j;
		for (i=0;i<r.length;i++)
			for (j=0;j<length;j++)
				result.num[i+j]+=r.num[i]*num[j];
		result.point=r.point+point;
		for (i=0;i<r.length + length;i++){
			result.num[i+1]+=result.num[i]/10;
			result.num[i]%=10;
			if (result.num[i])
				result.length=i+1;
		}
		return result;
	}

	//阶乘方法
	mFloat factorial (mFloat r,int n){
		if (n==1)
			return r;
		if (n==2)
			return r*r;
		mFloat result = factorial(r,n/2);
		result=result*result;
		if (n%2)
			result=result*r;
		return result;
	}
};

int main(){
	int n;
	mFloat r;

	while (r.read()){;
		cin>>n;
		r=r.factorial(r,n);
		r.write();
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值