uva 748 - Exponentiation

//大数乘法的一个技巧在于错位,即设当前处理的位置 k=i+j (i,j要从0开始)

#include <iostream> #include <cstdio> #include <string> #include <memory.h> using namespace std; const int MAX=100; struct BigNumber{ int l,dot,c[MAX]; }; BigNumber a,b,ans; int n; string line; void multiply(){ //cout<<9<<endl; int k,carry,backZero=0;//carry是进位 ans.l=1; ans.dot=0; memset(ans.c,0,sizeof(ans.c)); for(int i=0;i<a.l;i++){ carry=0; for(int j=0;j<b.l;j++){ k=i+j; carry+=a.c[i]*b.c[j]+ans.c[k]; ans.c[k]=carry%10; if(k+1>ans.l) ans.l=k+1; carry/=10; } while(carry!=0){ //cout<<'s'<<endl; carry+=ans.c[++k]; ans.c[k]=carry%10; carry/=10; if(k+1>ans.l) ans.l=k+1; } } ans.dot=a.dot+b.dot; for(int i=0;i<ans.dot;i++){ if(ans.c[i]==0){ ans.l--; backZero++; } else break; } if(backZero){ for(int i=0;i<ans.l;i++) ans.c[i]=ans.c[i+backZero]; } ans.dot-=backZero; a=ans; } int main(){ freopen("i.txt","r",stdin); freopen("e://t2.txt","w",stdout); while(cin>>line>>n){ b.l=0; //cout<<line<<" "<<n<<endl; for(int i=0;i<(int)line.size();i++){ if(line[i]=='0'&&i+1<(int)line.size()&&line[i+1]!='.'){ continue; } //cout<<i<<endl; for(int j=(int)line.size()-1;j>=i;j--){ if(line[j]=='.'){ //b.dot=((int)line.size()-1-i)-j;//判断小数有几位 b.dot=((int)line.size()-i)-(j-i+1); //cout<<b.dot<<endl; continue; } b.c[b.l++]=line[j]-'0'; } break; } a=b; //cout<<a.dot<<endl; /*for(int i=a.l-1;i>=0;i--){ if(i==a.dot){ //if(a.c[i]&&i!=0&&a.dot!=1){ if(a.dot!=a.l-1||a.c[i]){ cout<<a.c[i]; } if(i) cout<<'.'; continue; } cout<<a.c[i]; } cout<<endl;*/ b.l=1; b.dot=0; b.c[0]=1; multiply(); b=a; while(--n) multiply(); //cout<<a.dot<<endl; for(int i=a.l-1;i>=0;i--){ if(i==a.dot){ //if(a.c[i]&&i!=0){ if(a.dot!=a.l-1||a.c[i]){ cout<<a.c[i]; } if(i) cout<<'.'; continue; } cout<<a.c[i]; } cout<<endl; } return 0; }

你可能感兴趣的:(uva 748 - Exponentiation)