这题算是一道入门模拟题吧,要自己手写高精度浮点数,对输出格式还有一定的要求,还要写一个阶乘函数,要求有点多啊~
其实,你看她第一眼——你已经知道算法了吧!一个高精度整数加上单独的浮点处理加上二分法求阶乘加上格式化输出,总的来说
都是靠我们耐心的吧!感觉手不是自己的了。废话不多说,上代码
//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;
}