求高精度幂

来源:互联网 发布:树莓派读取温湿度数据 编辑:程序博客网 时间:2024/05/29 09:43

求高精度幂

时间限制:3000 ms  |  内存限制:65535 KB
难度:2
描述

对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 

现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R  n 次方(Rn),其中是整数并且 0 < =n <= 25

输入
输入有多行,每行有两个数R和n,空格分开。R的数字位数不超过10位。
输出
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
样例输入
95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12
样例输出
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
大数问题的加减乘除,求幂,求开方,求浮点数,学习了几道题后,感觉遇到大数后不会再恐惧啦。

#include<stdio.h>  #include<string.h>  #define N 260  int ans[N+1],temp1[N+1],temp2[N+1];  void multi(int site, int n){      int i,j,len1,len2;      temp2[0]=1,site=n*site;      while(n--){          for(i=N-1;i>=0;i--)              if(temp1[i]!=0) {                  len1=i;                  break;              }          for(j=N-1;j>=0;j--)              if(temp2[j]!=0) {                  len2=j;                  break;              }          for(i=0;i<=len1;i++){              for(j=0;j<=len2;j++)                  ans[i+j]+=temp1[i]*temp2[j];          }          for(i=0;i<N;i++){              if(ans[i]>=10) {                  ans[i+1]+=ans[i]/10;                  ans[i]%=10;              }          }          for(i=0;i<N;i++){              temp2[i]=ans[i];              if(n!=0) ans[i]=0;          }      }      for(i=N-1;i>=0;i--){          if(ans[i]!=0){              len1=i;              break;          }      }      for(i=0;i<N;i++){          if(ans[i]!=0){              len2=i;              break;          }      }      if(len1==site)  ;     else if(len1<site) len1=site-1;        for(i=len1;i>=len2;i--){          if(i==site-1) printf(".");          printf("%d",ans[i]);      }      printf("\n");  }  int main(){ //freopen("题.txt", "r", stdin);     int n,len,i,j,site;      char s[20];      while(scanf("%s %d",s,&n)!=EOF){          memset(temp1,0,sizeof(temp1));          memset(temp2,0,sizeof(temp2));          memset(ans,0,sizeof(ans));          len=strlen(s);          if(n==0) {              printf("1\n");              continue;          }          for(i=len-1,site=0,j=0;i>=0;i--){              if(s[i]!='.') temp1[j++]=s[i]-'0';              else site=j;          }          multi(site,n);      }      return 0;  }  


0 0
原创粉丝点击