#POJ1001#
其实我觉得挺难写的,所以参考了别人的代码。
1 #include <iostream> 2 #include<iomanip> 3 #include<cstring> 4 using namespace std; 5 int s; 6 void chen(char a[],char b[])//a=a*b //高精度乘法 7 { int i,j,k,l,sum,c[410]={0}; 8 l=strlen(a)+strlen(b); 9 for(i=strlen(b)-1;i>=0;i--) 10 for(j=strlen(a)-1,k=i+j+1;j>=0;j--,k--) 11 { sum=(b[i]-'0')*(a[j]-'0')+c[k]; 12 c[k]=sum%10;c[k-1]+=sum/10; 13 } 14 for(i=c[0]?0:1,j=0;i<l;i++) //结果保存在a中 15 a[j++]=(c[i]+'0'); a[j]=0; 16 } 17 void quw0(char a[]) //去除尾部多余的零 //初始化b 18 { int i=strlen(a)-1; 19 while(a[i]=='0') {a[i]=0;i--;} 20 } 21 22 void jilu(char a[]) //处理小数点,记录位置 23 { int i,t; 24 for(i=0;i<strlen(a);i++) //判断有没有小数点 25 if(a[i]=='.') break; 26 if(i!=strlen(a)) //有小数点 27 { 28 for(i=strlen(a)-1,s=0;i>=1;i--)// s记录小数位数 29 if(a[i]!='.') s++; 30 else break; 31 if(a[i=0]=='0') // 0.0123变成123 32 { for(i=2;i<strlen(a);i++) 33 if(a[i]!='0') {strcpy(a,&a[i]);break;} 34 } 35 else //将1.4321 变成14321 36 { for(t=0,i=1;i<strlen(a)-1;i++) 37 { if(a[i]=='.') t=1; 38 if(t) a[i]=a[i+1]; 39 } 40 a[i]=0; 41 } 42 } 43 44 } 45 46 void show(char a[]) //处理结果 47 { int i; 48 if(s>=strlen(a)) cout<<'.'<<setfill('0')<<setw(s)<<a<<endl;// 前面补零 49 else //不用补零,直接加入小数点输出 50 {for(i=0;i<strlen(a);i++) 51 if(strlen(a)-s==i) {cout<<'.'<<&a[i]; break;} 52 else cout<<a[i]; 53 cout<<endl; 54 } 55 56 } 57 58 int main() 59 { 60 int n; char b[205],a[205]; 61 while(cin>>b>>n) 62 { if(n==0) {cout<<1<<endl;continue;}//将n和分为0和非0,如果是0,直接输出1 63 s=0; //s为记录小数点的位置,为全局变量 64 quw0(b);//初始化,把输入的b后面的多余的0去除 65 jilu(b); //讲小数化为整数,为后面的高精度乘法做准备 66 strcpy(a,b); //用一个新的数组a等效于b,例如b^3=b*b*b=(a*b)*b=(a‘)*b;3个b相乘, 67 for(int i=2;i<=n;i++) //就是实现(a*b),然后用a在保存a*b的结果 68 chen(a,b); //这个函数等效于a=a*b; 69 s*=n; //结果的小数位数 70 show(a); //输出结果,处理小数点 71 } 72 return 0; 73 } 74