Exponentiation&&小数的大数乘法

在这里插入图片描述
Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

这个题的意思是给出几组数,每组一个小数和一个整数,要求求出小数的整数次方,
相当于大数乘法加上小数点进位,不过由于一些特殊的数和补零的问题,WA了好几发T^T
代码中的两个自定义函数意思差不多,不过适用于不同的情况,由于改了好几次,可能代码有些赘余。。。

代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
string s;
char a[20005];
int l[20005],m[20005],mmp[20005];
int len,z;
void mdltxdy(int l[],int m[])
{
    memset(mmp,0,sizeof(mmp));
    for(len=20000; l[len]==0; len--);
    for(int i=0; i<=len; i++)
    {
        for(int j=0; j<z-1; j++)
        {
            mmp[i+j]+=l[i]*m[j];
        }
    }
    for(int i=0; i<20000; i++)
    {
        if(mmp[i]>=10)
        {
            mmp[i+1]+=mmp[i]/10;
            mmp[i]%=10;
        }
        l[i]=mmp[i];
    }
}
void cmttxdy(int l[],int m[])
{
    memset(mmp,0,sizeof(mmp));
    for(len=20000;l[len]==0;len--);
    for(int i=0;i<=len;i++)
    {
        for(int j=0;j<z;j++)
        {
            mmp[i+j]+=l[i]*m[j];
        }
    }
    for(int i=0;i<20000;i++)
    {
        if(mmp[i]>=10)
        {
            mmp[i+1]+=mmp[i]/10;
            mmp[i]%=10;
        }
        l[i]=mmp[i];
    }
    //printf("%d ",l[0]);
}
int main()
{
    int k;
    int flag3;
    while(cin>>s>>k)
    {
        flag3=0;
        if(s.find('.')!=-1)
        {
            int x=0,y;
            z=s.size();
            for(int i=0; i<z; i++)
            {
                if(s[i]=='.')
                {
                    y=z-1-i;
                    continue;
                }
                a[x++]=s[i];
            }/*for(int i=0;i<100;i++)
                    printf("%c",a[i]);*/
            for(int i=0; i<z-1; i++)
            {
                l[i]=a[z-2-i]-'0';
                m[i]=a[z-2-i]-'0';
                if(l[i]!=0)
                {
                    flag3=1;
                }
            }
            if(flag3==0)
            {
                printf("0\n");
                continue;
            }
            //puts("");

            for(int i=0; i<k-1; i++)
            {
                mdltxdy(l,m);
            }
            int cnm=20005;
            int flag1=0;
            for(; l[flag1]==0&&flag1<k*y; flag1++);
            for(; l[cnm]==0; cnm--);
            if(cnm>=k*y)
            {
                for(int i=cnm; i>=flag1; i--)
                {
                    printf("%d",l[i]);
                    if(i==k*y&&flag1!=k*y)
                        printf(".");
                }
                printf("\n");
            }
            else
            {
                printf(".");
                for(int i=0; i<k*y-cnm-1; i++)
                    printf("%d",0);
                for(int i=cnm; i>=flag1; i--)
                {
                    printf("%d",l[i]);
                }
                printf("\n");

            }
        }
        else
        {
            int x=0,y;
            z=s.size();
            for(int i=0; i<z; i++)
            {
                a[x++]=s[i];
            }
            for(int i=0; i<z; i++)
            {
                l[i]=a[z-1-i]-'0';
                m[i]=a[z-1-i]-'0';
                if(l[i]!=0)
                {
                    flag3=1;
                }
            }
            if(flag3==0)
            {
                printf("0\n");
                continue;
            }
            for(int i=0;i<k-1;i++)
            {
                cmttxdy(l,m);
            }
            int flag2=20000;
            for(;l[flag2]==0;flag2--);
            for(int i=flag2;i>=0;i--)
            {
                printf("%d",l[i]);
            }
            puts("");
        }
        s.clear();
        memset(l,0,sizeof(l));
        memset(m,0,sizeof(m));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43105110/article/details/89310040