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;}