首页 > 代码库 > HighAccuracy1001
HighAccuracy1001
给定一个浮点数A,一个整数B,求A^B
#include <iostream>
#include <cstring>
using namespace std;
#define SIZE 1000
void reverse(char t[],int n) //reverse(s,ls) 倒序,;将12345换成54321,这样可以将进位放到后面
{
int i=0,j=n-1;
while(i<j)//相等的时候就没必要换了
{
char tmp=t[i];
t[i]=t[j];
t[j]=tmp;
i++,j--;
}
}
void check(int tmp[],int n,char result[]) //处理进位
{//ls位的数与lt位的数相乘,最大位就是ls+lt,因此需要考虑temp[ls+lt]这一位
int i,j,k=0;
for(i=0;i<n;i++)
{
tmp[i+1]+=tmp[i]/10;
tmp[i]=tmp[i]%10;
}
while(tmp[i]==0) i--;//找到正序下的首个非0数
for(j=i;j>=0;j--)
result[k++]=tmp[j]+‘0‘;//改成正序,换成字符串回去
result[k]=0;
}
void mul(char s[],char t[],char result[])//mul(s,result,result);
{
int ls=strlen(s);
int lt=strlen(t);
reverse(s,ls);
reverse(t,lt);
int tmp[SIZE*2]={0};//初始为0
int i,j,k;
int a=0;
for(i=0;i<ls;i++)
for(j=0;j<lt;j++)
tmp[i+j]+=(int)(s[i]-‘0‘)*(int)(t[j]-‘0‘);
//第i个数与第j个数相乘,结果放在i+j的位置上。字符型换成数字要减去‘0‘
//temp是INT型,这里相乘累加的结果可能大于10,比如15
check(tmp,i+j,result);//i=ls,j=lt,处理进位
}
void process(char s[],int &point) //运算之前先去掉小数点,并且统计有多少个小数
{
int len=strlen(s);
char tmp[SIZE];
int i=len-1;
while(i>0) //这里假设小数点不会出现在第0个字符处
{
if(s[i]==‘.‘)break;
i--;
}
if(i>0) //里面有小数点
{
while(s[len-1]==‘0‘) len--; //如果是小数,那么去掉小数点最后面无效的0
point=len-i-1;//point表示有多少个小数
int j=0;
for(i=0;i<len;i++)
if(s[i]!=‘.‘)
s[j++]=s[i];
s[j]=0;//字符串,补上末尾结束标志
}
}
void show(int point,char result[]) //将小数点添加上去显示结果,共n*point个小数
{
int len=strlen(result);
int tmp[SIZE*2];
if(point>=len)//全是小数
cout<<".";
while(point>len)//数字前面到小数点之间的数全部是0
{
cout<<"0";
point--;
}
for(int i=0;i<len;i++)
{
cout<<result[i];
if(i==len-1-point&&point!=0)//小数点在中间的情况
cout<<".";
}
cout<<endl;
}
int main()
{
char s[SIZE];
int n;
while(cin>>s>>n)
{
int i,point=0;
process(s,point);
char result[SIZE*2];
char tmp[SIZE];
strcpy(result,s);
strcpy(tmp,s);
for(i=0;i<n-1;i++)//第一次用s*s,用了两次S,因此共循环n-1次即可
{
strcpy(s,tmp);
mul(s,result,result);
}
show(point*n,result);
}
return 0;
}
HighAccuracy1001