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

Exponentiation -高精度求幂的自我总结

2014年10月24日 ⁄ 综合 ⁄ 共 1453字 ⁄ 字号 评论关闭

这道题之前也试过几次,但是很多问题处理不好,所以一直没拿下,今天放假了沉下心来好好坐了坐,花了1个多小时拿下了,求幂其实也是关于乘法的一个高级运用,也算一个基础吧,思路就是用3个数组反复的做乘法,之后考虑前导后导0的控制

下面上原创代码

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 1000 + 10
int get_array(char x[],int y[])/*这个数组是用来将字符串转化为数组元素的*/
{
    int L=strlen(x);
    int i,j,point;
    for(i=0,j=L-1;j>=0;j--)
     {
     if(x[j]>='0'&&x[j]<='9')
        {
            y[i]=x[j]-'0';
            i++;
        }
      else if(x[j]=='.')
        point=j;           /*记录小数点的位置最为返回值*/
     }
    return point;
}
int go_to(int a[],int b[],int c[])
{
    int i,j;
    for(i=0;i<MAX_SIZE/2 -10 ;i++)
        for(j=0;j<MAX_SIZE/2-10 ;j++)
        c[i+j]+=a[i]*b[j];        /*这里只是存储不着急进位*/
    for(i=0;i<MAX_SIZE;i++)
    {                              /*高精度乘法的进位*/
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    return ;
}
int memse_t(int x[])
{
    int i;
    for(i=0;i<MAX_SIZE;i++)
        x[i]=0;
    return ;
}
int xx(int c[],int w)
{
    int i,j;
     /*先输出整数的部分,到小数点截止住*/
        for(i=MAX_SIZE-10,j=0;i>=6*w;i--)
            {
                if(j==1)
                printf("%d",c[i]);
                else if(c[i]!=0)
                {
                    printf("%d",c[i]);
                    j=1;
                }
            }
           printf(".");
        for(j=0;c[j]==0;j++);/*这里去除小数点后的多余的0*/
        for(;i>=j;i--)
            printf("%d",c[i]);/*输出小数点后面的数字*/

        return ;
}
int main()
{
    char x[MAX_SIZE];
    int  a[MAX_SIZE]={0},b[MAX_SIZE]={0},c[MAX_SIZE]={0};
    double  m;
    int i,j,k,n,L,point,w;
    while(scanf("%lf %d",&m,&n)!=EOF)
    {
        sprintf(x,"%lf",m);
    point=get_array(x,a);
          get_array(x,b);
    w=n;
    k=n;
    n--;
    while(1)  /*这里用多次相乘*/
    {
        if(n==0)  break;
        memse_t(c);
        go_to(b,a,c);  /*这里将b,a乘结果放在c里面*/
        n--;
        if(n==0)  break;
        memse_t(b);    /*这里将c,a乘结果放在b里面*/
        go_to(c,a,b);
        n--;
    }
    if(k%2==0)/*这里输出的为数组c*/
        xx(c,w);
    if(k%2==1) /*这里输出的为数组b*/
        xx(b,w);
        
    printf("\n");
    
    memse_t(c);
    memse_t(a);
    memse_t(b);
    }
    return 0;
}

这题其实我也知道了干什么事一定要用心去做,不能浮躁,我觉得这也是我以后如果成为一个ACMer应该必须具备的素质之一吧,所以在这个寒假除了学习必要的算法以及知识,我认为培养一颗强大的心脏也是我的目标之一!


抱歉!评论已关闭.