• pku_1001_Exponentiation(求高精度的幂)


    题意: 求一个实数R的n次幂  即ans = R ^ n;
    方法: 模拟高精度乘法
    两个大数相乘,以字符串输入,用数组a[], b[]按位存储,最终结果用另外一个数组c[]存储
    核心代码:

    memset(c, 0, sizeof(c)); //初始化结果数组
    for(i = 0; i < l1; i++)
         for(j = 0; j < l2; j++) 
         {
                c[i + j] += a[i] * b[j];
                c[i + j + 1] += c[i + j] / 10;
                c[i + j] %= 10;
          }


    此题方法,将小数点额外运算,计数小数点的最终位置,运用多次大数相乘,计算结果。

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char d[150]={0};
        int n;
        while(scanf("%s%d",d,&n)!=EOF)
        {
             int a[150]={0},b[150]={0},c[150]={0},temp,flag;
             int lend,lena,lenb,lenc,len,i,j,k,digit,s;
             lend=strlen(d)-1;                           //整个字符串长度
             for(i=0;d[i];i++)
                 if(d[i]=='.')
                    break;
             digit=lend-i;                              //小数部分的长度
             for(j=i;d[j];j++)
                 d[j]=d[j+1];              //去掉小数点的字符串
             lend=lend-1;                               //调整长度
             for(i=0;i<=lend/2;i++)                     //字符串倒转
             {
                 temp=d[i];
                 d[i]=d[lend-i];
                 d[lend-i]=temp;
             }
             for(i=0;d[i];i++)
                 a[i]=d[i]-48;              //字符串转为数
             lena=lend;
             for(i=0;i<=lena;i++)
                 b[i]=a[i];              //浮点数复制一份
             lenb=lena;
             for(i=1;i<=n-1;i++)                          //浮点数n次方 结果在c数组中
             {               
                 for(j=0;j<=lenb;j++)               //两重for将两数相乘
                      for(k=0;k<=lena;k++)
                      {                
                            c[j+k]+=a[k]*b[j];               
                            c[k+j+1]+=c[j+k]/10;       
                            c[j+k]%=10;
                      }               
                 k--;j--;
                 if(c[k+j+1]!=0)
                     lenc=j+k+1;
                 else
                     lenc=j+k;
                 for(j=0;j<=lenc;j++) 
                     b[j]=c[j];
                 lenb=lenc;
                 memset(c,0,sizeof(c));
            }
            digit=n*digit;                        //总的小数位数
            len=lenb+1-digit;
            //以下将结果输出
            flag=0;
            for(i=lenb-len;i>=0;i--)
                if(b[i]!=0)
                {
                    flag=1;
                    break;
                }
            if(flag==0)
            {       
                for(i=lenb;i>=lenb-len+1;i--)
                    printf("%d",b[i]);
                printf("\n");
                continue;
            }
            if(len==1&&b[lenb]==0)
                printf(".");
            else     
            {
                for(i=lenb;i>=lenb-len+1;i--)
                    printf("%d",b[i]);
                printf(".");
            }
            for(i=0;i<=lenb-len;i++)
                if(b[i]!=0)
                {
                    temp=i;
                    break;
                }
            for(i=lenb-len;i>=temp;i--)
                printf("%d",b[i]);
            printf("\n");
        }
        return 0;
    }
  • 相关阅读:
    [2019.2.24]BZOJ4591 [Shoi2015]超能粒子炮·改
    [2019.2.13]BZOJ4318 OSU!
    [2019.1.17]BZOJ1066 [SCOI2007]蜥蜴
    [2019.1.15]BZOJ2152 聪聪可可
    [2019.1.17]BZOJ3993 [SDOI2015]星际战争
    [2019.1.14]BZOJ2005 [Noi2010]能量采集
    [2019.1.10]BZOJ1853 [Scoi2010]幸运数字
    [2019.1.9]BZOJ2299 [HAOI2011]向量
    yyb博客的几道神仙题
    CQOI2018异或序列 [莫队]
  • 原文地址:https://www.cnblogs.com/sooner/p/2457143.html
Copyright © 2020-2023  润新知