首页 > 代码库 > 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‘

//tempINT型,这里相乘累加的结果可能大于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