现在的位置: 首页 > 综合 > 正文

大数运算(高精度) (六)—— 大数求幂

2012年09月10日 ⁄ 综合 ⁄ 共 1363字 ⁄ 字号 评论关闭

/**  大数(高精度)求幂  **/
 
//输入两个数字 m(可以带小数点),n,求m的n次方

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char multiply[1000];
void multiplyer(char *a,char *b)       //实质上就是俩个整型大数的乘法
{
    int i,j,num,tem;
    int multy[1000]= {0};
    for(i=strlen(a)-1; i>=0; i--)
        for(j=strlen(b)-1,tem=strlen(a)-1-i; j>=0; j--,tem++)
        {
            num=(a[i]-'0'+0)*(b[j]-'0'+0)+multy[tem];
            multy[tem]=num%10;
            multy[tem+1]+=num/10;
        }
    for(i=999; i>=0; i--)
        if(multy[i])
            break;
    for(j=0; i>=0; i--)
        multiply[j++]=multy[i]+'0';
}

int main()
{
    char a[10];
    int b,i,fcount,num,flag;
    while(scanf("%s %d",a,&b)!=EOF)
    {
        memset(multiply,0,sizeof(multiply));
        for(i=0,num=0; i<=strlen(a)-1; i++)
            if(a[i]=='.')                  //需记录浮点数所在的位数
            {
                fcount=strlen(a)-1-i;
                for(; i<=strlen(a)-1; i++)
                    a[i]=a[i+1];
                num=fcount*b;      //记录小数点后数字的位数
                break;
            }
        for(i=0; i<=strlen(a)-1; i++)
            if(a[i]!='0')
                break;
        for(fcount=0; i<=strlen(a); i++)
            a[fcount++]=a[i];
        strcpy(multiply,a);
        b=b-1;
        while(b--)
            multiplyer(multiply,a);
        if(num<=strlen(multiply))   //根据补小数点的位置,需分情况讨论
        {
            for(i=strlen(multiply)-1; i>=0; i--)
                if(multiply[i]!='0')
                {
                    flag=i;
                    break;
                }
            for(i=0; i<=strlen(multiply)-1; i++)
            {
                printf("%c",multiply[i]);
                if(i==strlen(multiply)-num-1)  //浮点数求幂在相应位置上补小数点
               {
                       if(i==flag) //判断若是整数的幂次方,则不需要输出小数点而直接跳出
                           break;
                       printf(".");
               }
                if(flag==i)
                    break;
            }
        }
        else                      //若num>multily的位数,需要在小数点后补足相应位数的零
        {
            for(i=strlen(multiply)-1; i>=0; i--)
                if(multiply[i]!='0')
                {
                    multiply[i+1]='\0';
                    break;
                }
            printf(".");
            for(i=strlen(multiply); i<=num-1; i++)
                printf("0");
            printf("%s",multiply);
        }
        puts("");
    }
    return 0;
}

抱歉!评论已关闭.