求浮点数的幂的精确值

//http://poj.org/problem?id=1001
//求浮点数的幂的精确值,R的n次方,R是实数(0.0<R<99.999),n是幂(0<n<=25)

大数据求幂
95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAXN=1005;
struct BigInt
{
    int e[MAXN],len;
    int pis;//小数点位数
    BigInt()
    {
        //将数组e的内容全部设置为0,memset函数通常是为新申请的内存做初始化工作
        memset(e,0,sizeof(e));//它是对较大的结构体或数组进行清零操作的一种最快方法
        len=0;
        pis=0;
    }
    //去掉小数点,将字符数组倒序转换成整型数组。因为乘法竖式是按照后面来做乘法,所以倒过来要方便
    void set(char s[])
    {
        int pp;//小数点位置,比如12.34,那么pp就是2
        for(int i=0; s[i]; i++)
        {
            if(s[i]=='.')
            {
                pp=i;
                break;
            }
        }
        int l=strlen(s)-1;
        pis=l-pp;//几位小数
        for(int i=l; i>=0; i--)
        {
            if(s[i]=='.')
                continue;
            e[len++]=s[i]-'0';
        }
        while(e[len-1]==0&&len>1)
            len--;
    }
    //重载*操作符
    BigInt operator*(const BigInt& b)
    {

        BigInt res;
        for(int i=0; i<len; i++)
        {
            int up=0;
            for(int j=0; j<b.len; j++)
            {
                int z=(e[i]*b.e[j]+up+res.e[i+j]);
                res.e[i+j]=z%10;//取模,取0~9一位数
                up=z/10;//整除,进位
            }
            if(up!=0)
            {
                res.e[i+b.len]=up;
            }
        }
        res.pis=pis+b.pis;
        res.len=len+b.len;
        while(res.e[res.len-1]==0&&res.len>1)
            res.len--;
        return res;
    }
    void print()
    {
        int limit=0;
        while(e[limit]==0&&limit<pis)
            limit++;//去后导0
        if(pis>=len)
        {
            cout<<"0.";
            for(int i=pis; i>len; i--)
            {
                cout<<0;//小数点后面填充0,0的数量为pis-len
            }
            for(int i=len-1; i>limit; i--)
            {
                cout<<e[i];
            }
            cout<<e[limit]<<endl;
        }
        else
        {
            for(int i=len-1; i>=pis; i--)//倒序输出整数部分
            {
                cout<<e[i];
            }
            if(limit<pis)
            {
                cout<<".";
                for(int i=pis-1; i>limit; i--)//倒序输出小数部分
                {
                    cout<<e[i];
                }
                cout<<e[limit]<<endl;
            }
            else
                cout<<endl;
        }
    }
    void print2()
    {
        for(int i=0; i<len-1; i++)
        {
            cout<<e[i];
        }
        cout<<e[len-1]<<endl;
    }
};
char buf[MAXN]="1.0";
char a[MAXN],b[MAXN];
int n;
int main()
{
    while(cin>>a>>n)
    {
        BigInt res,x;
        res.set(buf);
        x.set(a);
        for(int i=0; i<n; i++)
        {
            res=res*x;
        }
        cout<<endl;
        res.print();
        //res.print2();
    }
    return 0;
}
发布了46 篇原创文章 · 获赞 9 · 访问量 3656

猜你喜欢

转载自blog.csdn.net/weixin_41896770/article/details/101069414