Time Limit:500ms Memory Limit:10000K
Description
Input
Output
Sample Input
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
在计算机上进行高精度计算,首先要处理好以下几个基本问题:
运算因子超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来表示。能表示多个数的数据类型有两种:数组和字符串。
还有就是:输出时对非最高位的补零处理。
#include<iostream> using namespace std; #define max 200 int main() { int a[max]={0},n,e,j,k,q,set=0;//base的n次方 char c[20];//接收输入字符串 while(cin>>c>>n) { int len=strlen(c),base=0,i,record=0; for(i=0;i<len;i++) { if(c[i]=='.') { record=len-i-1;//record为小数的位数 continue; } base=base*10+c[i]-'0'; } if(record) { for(k=len-1;c[k]=='0';k--,record--) base/=10;//去掉后面多余的0; } record*=n;//record为总的小数位 for(q=base,i=0;i<max;i++,q/=10) { a[i]=q%10;//把base复制到数组a } for(j=0;j<n-1;j++) { for(i=0;i<max;i++) { a[i]=a[i]*base+set; set=a[i]/10; a[i]=a[i]%10; } }//计算,结果保存在数组a中 for(i=max-1;i>=0;i--)//i是首个不为0的 if(a[i]!=0) break; if(record>i)//无整数部分 { cout<<"."; for(e=record-1;e>=0;e--) { cout<<a[e]; } } else //有整数部分 { for(;i>record-1;i--) { cout<<a[i]; } if(i>=0) cout<<"."; for(;i>=0;i--) cout<<a[i]; } cout<<endl; } return 0; }