#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;
}
UVa 748 - Exponentiation
最新推荐文章于 2016-09-06 02:51:00 发布