题目链接:http://poj.org/problem?id=1001
Source Code
Problem: 1001 | User: yuanting0505 | |
Memory: 256K | Time: 0MS | |
Language: C++ | Result: Accepted |
-
- Source Code
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
classbig_float
{
private:
int num[200];//6^25 最多150位
int pos;//pos为小数点位置
int length;//长度
public:
// big_float input_float(char *);//把输入的浮点数转化成 big_float型
big_float input_float(char *in){
big_float new_create;
new_create.pos=0;
new_create.length=0;
memset(new_create.num,0,sizeof(new_create.num));//各位置零
int i=0;
int len=0;
int length=(int)strlen(in);
for(i=0;i<length;i++)
{
if(in[length-1-i]=='.')//from back
{
new_create.pos=i;
}
else
{
new_create.num[len]=in[length-1-i]-'0';//不是num[i]啊啊啊啊
//减去0的ascll码,效果跟(int)(in[length-1-i])一样吧。。。
len++;
}
}
new_create.length=len;
return new_create;
}
big_float a_b(big_float a,big_float b )//计算a*b
{
big_float c;//c用来存储计算结果
c.pos=a.pos+b.pos;//小数点
c.length=a.length+b.length;
memset(c.num,0,sizeof(c.num));
int i=0;
int j=0;
for(i=0;i<a.length;i++)//先乘
{
for(j=0;j<b.length;j++)
{
c.num[i+j]+=a.num[i]*b.num[j];
}
}
//进位
for(int k=0;k<c.length;k++)
{
if (c.num[k]>9)
{
c.num[k+1]+=c.num[k]/10;
c.num[k]%=10;
while(c.num[c.length])//进位进到了最高位
c.length++;
}
}
return c;
}
void r_n(big_float r,int n)//计算r^n次
{
big_float t;
if(n==0)
{
cout<<1;
}
else if(n==1)
{
r.print_float();
}
else
{
int i=0;
t=t.a_b(r, r);
for(i=0;i<n-2;i++)
{
t=t.a_b(t,r);
}
t.print_float();
}
}
void print_float()//按要求打印a
{
int i=0;
int j=0;
while((this->num[j]==0)&&(j<pos)){//小数点之后的0可以去掉
j++;
}
while((this->num[this->length-1-i]==0)&&(this->length-i>pos)){//小数点之前的0可以去掉
i++;
}
/* 输出有问题 length和实际长度不一致的时候会出错
if(this->length-i<=pos)//说明数为.34343 这种类型
{
cout<<'.';
for(int k=i;k<this->length-j;k++)//打出i到j
{
cout<<this->num[this->length-k-1];
}
}
else if(j>=pos)//数为432.这种类型
{
for(int k=i;k<this->length-j;k++)
{
cout<<this->num[this->length-k-1];
}
}
else
{
int k=0;
for(k=i;k<this->length-pos+i-j;k++)
{
cout<<this->num[this->length-k-1];
}
cout<<'.';
for(k=this->length-pos+i-j;k<this->length-j;k++)
{
cout<<this->num[this->length-k-1];
}
}
cout<<endl;
*/
for(;i<this->length-j;i++)
{
if((this->length-i)==this->pos)
{
cout<<'.';
cout<<this->num[length-1-i];
}
else{
cout<<this->num[length-1-i];
}
}
cout<<endl;
}
};
int main(int argc, const char * argv[])
{
char *input=new char[10];
int n;
while( cin>>input>>n)
{
big_float input_num;
input_num=input_num.input_float(input);
big_float result;
result.r_n(input_num, n);
}
}