您的位置:首页 > 其它

高精度运算-748 求幂

2016-07-29 22:37 225 查看
题目大意,给出r和n,求r的n次方

解题过程:一次AC,好开森~

正确代码:# include <cstdio>
# include <cstdlib>
# include <ctime>
# include <cmath>
# include <iostream>
# include <fstream>
# include <cstring>
# include <string>

//*
#define fin cin
#define fout cout
//*/
# define maxn 500
using namespace std;

/*
ifstream fin("in.txt");
ofstream fout("out.txt");
//*/
struct bign{
int len,s[maxn];
bign(){
len=1;
memset(s,0,sizeof(s));
}
bign operator = (const char * num){
len=strlen(num);
for(int i=0;i<len;i++){
s[i]=num[len-1-i]-'0';
}
return * this;
}
bign operator = (int num){
char s[maxn];
sprintf(s,"%d",num);
*this=s;
return *this;
}

bign(const char* num){
memset(s,0,sizeof(s));
*this=num;
}
bign(int num){
memset(s,0,sizeof(s));
* this=num;
}
bign operator + (const bign& b) const{
bign c;
c.len=0;
for(int i=0,g=0;g||i<max(len,b.len);i++){
int x=g;
if(i<len) x+=s[i];
if(i<b.len) x+=b.s[i];
c.s[c.len++]=x%10;
g=x/10;
}
return c;
}
bign operator * (const bign& b) const{
bign * mid=new bign[len];
for(int i=0;i<len;i++){
mid[i].len=i;
int g=0;
for(int j=0;g||j<b.len;j++){
int x=g;
x+=s[i]*b.s[j];
mid[i].s[mid[i].len++]=x%10;
g=x/10;
}
while(mid[i].s[mid[i].len-1]>=10){
mid[i].s[mid[i].len]=mid[i].s[mid[i].len-1]/10;
mid[i].s[mid[i].len-1]%=10;
mid[i].len++;
}
}
bign result=0;
for(int i=0;i<len;i++){
result=result+mid[i];
}
return result;
}
string str() const{
string res="";
for(int i=0;i<len;i++){
res=(char)(s[i]+'0')+res;
}
if(res=="") res="0";
return res;
}
};

ostream& operator << (ostream& out,const bign& b){
out<<b.str();
return out;
}

int main()
{
double r;
int n,exp,factor;
while(fin>>r>>n){

if(r>=0&&r<10){
exp=-4;
r*=10000;
}
else{
exp=-3;
r*=1000;
}
factor=(int) r;
for(;;){
if(factor%10==0){
factor/=10;
exp++;
}
else break;
}

if(factor==1){
if(exp<0){
fout<<'.';
for(int i=0;i<(-1)*exp*n-1;i++){
fout<<'0';
}
fout<<factor<<endl;
}
else if(exp==0){
fout<<factor<<endl;
}
else {
fout<<factor;
for(int i=0;i<exp*n;i++){
fout<<'0';
}
fout<<endl;
}
}
else{
bign result=factor;
bign fac=factor;
for(int i=1;i<n;i++){
result=result*fac;
}
if(exp==0){
fout<<result;
fout<<endl;
}
else if(exp>0){
fout<<result;
for(int i=0;i<exp*n;i++){
fout<<'0';
}
fout<<endl;
}
else{
int length=-1*exp*n;
if(length>=result.len){
fout<<'.';
for(int i=0;i<length-result.len;i++) fout<<'0';
fout<<result;
fout<<endl;
}
else{
for(int i=result.len-1;i>=length;i--){
fout<<result.s[i];
}
fout<<'.';
for(int i=length-1;i>=0;i--){
fout<<result.s[i];
}
fout<<endl;
}
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: