#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   

 

posted @ 2016-01-25 23:10  liyouvane  阅读(162)  评论(0编辑  收藏  举报