POJ 1001 Exponentiation 高精度小数相乘

这篇博客介绍了如何解决POJ 1001问题,即计算给定小数的n次幂。博主强调了在处理高精度小数时的难点,包括确定小数点位置和处理0的显示。在解决问题的过程中,博主遇到了n等于1的特殊情况,最终通过不断调整代码实现了正确解法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    好吧,又一轮刷POJ,之前欠下的债现在还上,前面还有个1001没做,看着摆在那总觉得不舒服= =虽然觉得麻烦......好吧,终究还是要写的。

    题意很简单,就是给你一个小数,然后求他的n次幂,麻烦就麻烦在高精度的还要写小数= =高精度的模板之前倒是打过,不过这个是小数,所以还要把对小数的处理加上。写这一步倒是花的时间比我预料中的要少,毕竟小数相乘,先处理好一开始的小数点后面有几位。最后结果的小数点后位数就是乘以n,再处理一下0就好了。不过这题最后处理格式弄晕了= =如果后面有小数前面是0就不用写0了,如果后面没有就不输出小数点了,比如结果是“0.01”就是“.01”,结果是“12”就是“12”,结果是“0.0”的话输出就是“0”。这些处理完之后还是WA了,才发现没有处理n是1的情况,好吧,百度到一个“10.000 1”的例子才发现了这个问题.....所以改来改去一会这加点一会那加点的,代码就弄的挺长了......

    总之A了就好~

    下面代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char shu[1005];
char ans[1005];
int n;
char mus[1005];

int multiply(char* a1,char* b1)
{
    memset(mus,0,sizeof(mus));
    int i,j,k;
    int len,len1,len2;
    len1=strlen(a1);
    len2=strlen(b1);
    int mut=0,t;
    bool va[105];
    int s[105],adt[105];
    char a[105],b[105];
    memset(s,0,sizeof(s));
    memset(adt,0,sizeof(adt));
    memset(va,0,sizeof(va));
    for(i=len1-1,j=0;i>=0;i--)
    {
        a[i]=a1[j];
        j++;
    }
    for(i=len2-1,j=0;i>=0;i--)
    {
        b[i]=b1[j];
        j++;
    }
    for(i=0;i<len1;i++)
    {
        mut=0;
        for(j=0;j<len2;j++)
        {
            t=(a[i]-'0')*(b[j]-'0')+mut;
            mut=0;
            if(t>=10)
            {
                mut=t/10;
                t=t%10;
            }
            s[i+j]=t+s[i+j]+adt[i+j];
            va[i+j]=1;
            adt[i+j]=0;
            if(s[i+j]>=10)
            {
                if(!va[i+j+1])
                    adt[i+j+1]=s[i+j]/10+adt[i+j+1];
                else
                    adt[i+j+1]=s[i+j]/10;
                s[i+j]=s[i+j]%10;
            }
        }
        s[i+j]=mut;
    }
    s[i+j-1]=mut+adt[i+j-1];
    if(s[i+j-1]!=0)
        k=i+j-1;
    else
        k=i+j-2;
    for(i=k,j=0;i>=0;i--)
    {
        mus[i]=(s[j]+'0');
        j++;
    }
    return 0;
}

int main()
{
    int i,j;
    int len;
    while(scanf("%s",shu)!=EOF)
    {
        j=0;
        scanf("%d",&n);
        memset(ans,0,sizeof(ans));
        if(n==1)
        {
            strcpy(ans,shu);
            for(i=strlen(ans)-1;i>0;i--)
            {
                if(ans[i]!='0')
                    break;
                ans[i]=ans[i+1];
            }
            for(i=0;i<strlen(ans);i++)
            {
                if(ans[i]!='0')
                {
                    j=i;
                    break;
                }
            }
            if(j!=0)
            {
                for(i=0;i<strlen(ans)-j+1;i++)
                {
                    ans[i]=ans[i+j];
                }
            }
            if(ans[strlen(ans)-1]=='.')
            {
                ans[strlen(ans)-1]=ans[strlen(ans)];
            }
            if(strlen(ans)==0)
                cout<<0<<endl;
            else
                cout<<ans<<endl;
            memset(shu,0,sizeof(shu));
            continue;
        }
        for(i=0;i<strlen(shu);i++)
        {
            if(shu[i]=='.')
            {
                j=strlen(shu)-i-1;
                break;
            }
        }
        //cout<<j<<endl;
        for(;i<strlen(shu);i++)
        {
            shu[i]=shu[i+1];
        }
        multiply(shu,shu);
        strcpy(ans,mus);
        for(i=2;i<n;i++)
        {
            multiply(shu,ans);
            strcpy(ans,mus);
        }
        len=strlen(ans)-n*j;
        //cout<<n*j<<endl;
        for(i=strlen(ans);i>=len;i--)
        {
            ans[i+1]=ans[i];
        }
        ans[len]='.';
        for(i=strlen(ans)-1;i>0;i--)
        {
            if(ans[i]!='0')
                break;
            ans[i]=ans[i+1];
        }
        for(i=0;i<strlen(ans);i++)
        {
            if(ans[i]!='0')
            {
                j=i;
                break;
            }
        }
        if(j!=0)
        {
            for(i=0;i<strlen(ans)-j+1;i++)
            {
                ans[i]=ans[i+j];
            }
        }
        if(ans[strlen(ans)-1]=='.')
        {
            ans[strlen(ans)-1]=ans[strlen(ans)];
        }
        if(strlen(ans)==0)
            cout<<0<<endl;
        else
            cout<<ans<<endl;
        memset(shu,0,sizeof(shu));
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值