大数的幂运算

时间秒杀一切 提交于 2019-12-14 14:28:02

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

使用

n的m次方

#include<stdio.h>
#include<string.h>
int main()
{
    float a;
    long long i,j,m,b,p,sl,str[15],res[200],rl,t,d,tem,bak[200],bl;
    char num[100],rs[1000];
    while(~scanf("%s%lld",num,&b))
    {
        sl=i=0;
        m=strlen(num)-1;
        p=-1;
        memset(res,0,800);
        memset(rs,0,1000);
        for(i=0; i<m; i++)
        {
            if(num[i]!=48)
                break;
        }
        while(m>i)
        {
            if(num[m]!=48)
                break;
            m--;
        }
        for(; m>=i; m--)
        {
            if(num[m]=='.')
            {
                p=sl;
            }
            else
            {
                str[sl++]=num[m]-48;
            }
        }
        while(sl>1&&str[sl-1]==0)sl--;
        rl = sl;
        d=0;
        for(i=sl-1; i>=0; i--)
            d=d*10+str[i];
        sl=res[0]=1;
        for(j=0; j<b; j++)
        {
            if((tem=d/1000000)>0)
            {
                memset(bak,0,200*4);
                for(t=0,i=0;i<sl;i++){
                    t+=tem*res[i];
                    bak[i+1]=t%1000000;
                    t/=1000000;
                }
                bl=sl+1;
                if(t>0){
                    bak[bl++]=t;
                }
            }
            tem = d%1000000;
            for(t=i=0; i<sl; i++)
            {
                t+=tem*res[i];
                res[i]=t%1000000;
                t/=1000000;
            }
            if(t>0)res[sl++]=t;
            if(d/1000000){
                for(t=i=0;i<bl;i++){
                    t+=bak[i]+res[i];
                    res[i]=t%1000000;
                    t/=1000000;
                }
                sl=bl;
                if(t)
                    res[sl++]=t;
            }

        }
        for(i=sl-1; i>=0; i--)
        {
            sprintf(rs,i==sl-1?"%s%lld":"%s%06lld",rs,res[i]);
        }
        if(p>0)
        {
            m=strlen(rs);
            if(m<=b*p)
            {
                printf(m<b*p?".":"");
                for(i=0; i<b*p-m; i++)
                    printf("0");
                printf("%s\n",rs);
            }
            else
            {
                for(i=0; i<m; i++)
                {
                    printf(i==m-b*p?".%c":"%c",rs[i]);
                }
                printf("\n");
            }
        }
        else
        {
            printf("%s\n",rs);
        }
    }
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!