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;

}

时间: 2024-11-10 14:31:51

HighAccuracy1001的相关文章