UVa 748 - Exponentiation

#include<iostream>
#include<stdio.h>
#include<cstring>
#define max 150
using 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值