求高精度幂
Time Limit: 500MS | Memory Limit: 10000K | |
Total Submissions: 118427 | Accepted: 28874 |
Description
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。
现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。
现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。
Input
T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。
Output
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
Sample Input
95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201
Source
#define LEN 200//定义一个宏 #include<stdio.h> #include<string.h> char str1[6]={0};//记录初始浮点数的数组 int num1[6]={0},num2[LEN]={0},num[LEN]={0};//记录转化为数字后的各位数 void mul() { int i,j; for(i=0;i<=5;i++) { for(j=0;j<=LEN-1;j++) num[i+j]=num[i+j]+num1[i]*num2[j];//分别计算各位的乘积,并加到对应的位置上 } for(i=0;i<=LEN-1;i++) { if(num[i]>=10) { num[i+1]=num[i+1]+num[i]/10; num[i]=num[i]%10;//判断各位是否需进位 } num2[i]=num[i]; num[i]=0; } } int main() { int n,k,i,j,point,place; while(scanf("%s%d",str1,&n)==2) { k=0; for(i=5;i>=0;i--) { if(str1[i]!='.') { num2[k]=str1[i]-'0'; num1[k++]=str1[i]-'0';//把各位字符数转化为数字并记录 } else point=i;//记录小数点位数 } for(i=1;i<=n-1;i++) mul();//乘n次 i=LEN-1; while(num2[i]==0) i--; j=0; while(num2[j]==0) j++;//分别找到左右边第一个不是零的位置 place=n*(5-point);//计算小数点位置 if(place>=i+1) { printf("."); for(k=place-1;k>=j;k--) printf("%d",num2[k]); printf("\n"); }//如果小数点位比前面找到的两个位置所夹的长度长,则直接输出小数点并补0 else { if(j>place-1) { for(k=i;k>place-1;k--) printf("%d",num2[k]); }//若为整数则直接输出 else { for(k=i;k>=j;k--) { if(k==place-1) printf("."); printf("%d",num2[k]); } }//否则输出过程中在该输出小数点的位置输出小数点 printf("\n"); } memset(str1,0,sizeof(str1)); memset(num1,0,sizeof(num1)); memset(num2,0,sizeof(num2)); memset(num,0,sizeof(num));//清零 } return 0; }