高精度问题 国债

来源:互联网 发布:360软件宝库下载 编辑:程序博客网 时间:2024/04/27 17:09

题目描述

计算国债对于计算机来说是一件很繁重的事情,该问题涉及到的精度很高,现需要你编写一个程序用来计算R的n次方,这里R是一个实数(0.0<R<99.999),而n是一个整数(n<=30)。

输入

第1行是测试数据的组数m,每组测试数据占1行,每行包括一对数R和n。

输出

 对应每组测试数据输出一行结果,结果是R的n次的精确值,首尾无意义的零不要输出,如果是整数,不要输出小数点。

样例输入

295.123 1298.999 10

样例输出

548815620517731830194541.89902534341571597353596722186985272190429072743629540498.1075960194566517745610440100011
看见题目感觉很头大,因为这类高精度问题是前天才接触了大数加法,大数乘法就是今天的内容。
大数乘法的内容请看另一篇博文,转载大牛的http://blog.csdn.net/chhuach2005/article/details/21168179
#include<stdio.h>#include<string.h>void mult(int *p1,int *p2,int len1,int *len2 ){    int i,j,k,d,str[200];        memset(str,0,sizeof(str));    for (i=0;i<len1;i++ )        for (j=0;j<*len2;j++ )            str[i+j]+=p1[i]*p2[j];      //大数乘法    k=len1+(*len2);                    //结果可能最大位长    while(k>0&&str[k]==0)        k--;    k++;    for(i=0,d=0;i<k;i++)             //处理进位    {        p2[i]=(str[i]+d)%10;        d=(str[i]+d)/10;    }    if (d>0)                          //最高位进位    {        p2[i]=d;        k++;    }    *len2=k;}int main(){    char str_a[10],str_b[205];    int i,T,j,k,len_a,len_b,n,pot;    int a[10],b[200];    scanf("%d",&T);    while (T--)    {        scanf("%s%d",str_a,&n);        len_a=strlen(str_a);        k=len_a-1;        while(k>=0&&str_a[k]!='.')       //找出小数点位置            k--;        if (k<0)                             //判断小数点是否存在            pot=0;        else        {            j=len_a-1;            while(j>0&&str_a[j]=='0')      //去掉小数点尾部的0,使角标位于小数点尾部不等于0的地方                j--;            len_a=j+1;            str_a[len_a]= '\0';            pot=len_a-k-1;            //小数点后的位数        }        i=len_a-1;        k=0;        while(i>=0)        {            if(str_a[i]!='.')    //将大数颠倒存入并且去掉小数点,                a[k++]=str_a[i]-'0';            i--;        }      memset(b,0,sizeof(b));        len_a=len_b=k;        for (i=0;i<len_a;i++)            b[i]=a[i];                  //使乘数相同        for (i=1;i<n;i++)            mult(a,b,len_a,&len_b);        //做n-1次相乘        k = pot*n;                    //小数点位置        n = len_b > k? len_b:k;        for (j=0,i=n-1;i>=0;i--)          //结果转为字符串        {            if (i==k-1)                str_b[j++]='.';            str_b[j++]=b[i]+'0';        }        str_b[j]='\0';        printf("%s\n",str_b);      //输出结果    }    return 0;}
代码思路来源:http://write.blog.csdn.net/postedit/56676154
 
0 0
原创粉丝点击