UVa 748 - Exponentiation
来源:互联网 发布:淘宝哪个店买李宁正品 编辑:程序博客网 时间:2024/05/16 10:14
#include<iostream>#include<stdio.h>#include<cstring>#define max 150using namespace std;int c[max];//储存结果int temp[max];//暂时储存结果int len;//储存结果长度int dot(char* oc,int nc[])//返回底数小数位数,并将小数点去掉{ int j=1,i,k=0; int oclen=strlen(oc)-1; for(i=oclen;i>=0;i--) { if(oc[i]=='.') { k=j-1; continue; } nc[j++]=oc[i]-'0'; } return k;}void multiply(int* a,int* b)//将两个数组进行相乘{ memset(c,0,sizeof(c));//将结果储存变量清零 int i,j; for(i=max-1;b[i]==0;i--);//算出b数组所表示的数的长度 int lb=i; for(i=6;a[i]==0;i--);//算出a数组所表示的数的长度 int la=i; len=la+lb;//结果的长度等于len或者等于len-1 for(i=1;i<=la;i++)//进行数组相乘 for(j=1;j<=lb;j++) c[i+j-1]=c[i+j-1]+a[i]*b[j]; for(i=1;i<len;i++)//处理结果的进位 { c[i+1]=c[i+1]+c[i]/10; c[i]=c[i]%10; } if(c[len]==0)//结果的长度等于len-1的情况 len--;}int main(){ char s[7];//用于输入底数 int n; while(scanf("%s",s)!=EOF) { cin>>n;//输入指数 int a[7]={0},i,j;//a数组用于存放去掉小数点的底数 int p=dot(s,a);//底数小数位数 for(i=6;i>=0&&a[i]==0;i--); if(i==-1||n==0)//i=-1的话说明底数全部为0,结果为0。指数为0的话。结果为1。 { if(!n) cout<<1<<endl; else cout<<0<<endl; memset(c,0,sizeof(c)); memset(temp,0,sizeof(temp)); len=0; continue; } for(i=1;i<7;i++) c[i]=a[i]; int ok=0; for(j=1;j<n;j++)//底数的n次幂 { for(i=0;i<max;i++) temp[i]=c[i];//将结果暂时存放在temp数组 multiply(a,temp);//底数数组乘以temp数组 ok=1; } if(ok)//如果指数大于1 { while(c[len]==0&&len>p*n) len--;//算出结果的最高位 for(i=len;i>p*n;i--) cout<<c[i];//输出结果小数点前面的各位 int down=1; while(c[down]==0&&down<=p*n) down++;//算出结果的最低位 if(down!=p*n+1&&p!=0)//如果最低位不在小数点前面,则说明结果不为整数,输出小数点 cout<<'.'; for(i=p*n;i>=down;i--)//输出小数点后面的各位 cout<<c[i]; } else//如果指数等于1 同以上 { int up=6; while(c[up]==0&&up>p) up--; for(i=up;i>p;i--) cout<<c[i]; int down=1; while(c[down]==0&&down<=p) down++; if(down!=p+1&&p!=0) cout<<'.'; for(i=p;i>=down;i--) cout<<c[i]; } cout<<endl; memset(c,0,sizeof(c));//初试化全局变量 memset(temp,0,sizeof(temp)); len=0; }return 0;}