求高精度幂(南阳OJ155题)

16 篇文章 0 订阅

求高精度幂

时间限制:3000 ms  |  内存限制:65535 KB

难度:2

描述

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

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

 

分析:本题的解题步骤主要分为三步:

(1)先找到小数点,记录下小数点后面的有效数位;

(2)开始相乘运算,用一个数组a保存好每一次乘法的结果,再用这个结果继续乘以底数

(3)输出结果,分两种情况,幂的值为0,输出1,否则去掉前缀0,输出结果并且到一定位置输出小数点

代码:

#include<stdio.h>
#include<string.h>
int main(){
int n;//幂
char str[10];
int a[300];
   while(~scanf("%s%d",str,&n)){   
   int len,sum=0,bit=1;
   int i,j;
   int dot=0;//当没有小数点时小数点后的有效数位dot为0
   int num=0;//底数
   int state=1;
   len=strlen(str);
   
   for(i=0;i<300;i++)
   a[i]=0;
   
   for(i=len-1,j=0;i>=0;i--){
      if(str[i]=='0'&&state)sum++;//后赘0的长度
      else{
         state=0;
             if(str[i]=='.') dot=len-sum-i-1;//小数点后实际有效数位
             else{
                  state=0;
                  a[j++]=str[i]-'0';
                  num+=(str[i]-'0')*bit;//求出底数
                bit*=10;
             }
      }
   }    
     int prev=0;
     for(i=0;i<n-1;i++){//做n-1次乘法运算
         prev=0;
        for(j=0;j<300;j++){//这里的计算要好好理解一下,最好列个多位数相乘的竖式就明白了
         prev=a[j]*num+prev;
         a[j]=prev%10;
         prev/=10;
        }
     }
 //输出  
   if(n==0)printf("1");//任何数的0次方为1
   else{
    for(i=299;i>dot*n-1&&a[i]==0;i--);//去掉前缀0
     for(j=i;j>=0;j--){
        if(j==(dot*n)-1)printf(".");
        printf("%d",a[j]);
     }
   }
   printf("\n");      
}
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值