HDU 1063 Exponentiation

/*
题意:输入一个小数R,一个整数N,输出R^N

思路:将小数转换成整数然后求出R^N,然后判断出小数点的位置进行输出。

方法一通过,但是方法二我不知道那里有错误!只是输入方式不同而已,难道测试数据中存在空行?
*/
//方法一:
#include <cstdio>
#include <cstring>
const int nMax = 200;
struct BigNumber
{
    int data[nMax];
    int len;
    BigNumber(){len = 1; memset(data, 0, sizeof(data));}
    BigNumber(char *str){*this = str;}
    BigNumber & operator=(char *str);
    BigNumber operator*(int a);
    void clearLeadZero();
};
BigNumber & BigNumber::operator=(char *str)
{
    memset(data,0,sizeof(data));
    len = strlen(str);
    int i;
    for(i = 0; i < len; ++ i)
        data[i] = str[len - i - 1] - '0';
    return *this;
}
BigNumber BigNumber::operator *(int a)
{
    BigNumber z;
    int i;
    int q = 0;
    for(i = 0; i < len + 10; ++ i)
    {
        int p = data[i] * a + q;
        z.data[i] = p % 10;
        q = p / 10;
    }
    z.len = i;
    z.clearLeadZero();
    return z;
}
void BigNumber::clearLeadZero()
{
    while(len > 1 && !data[len - 1]) -- len;
}
void init(int &a, int &point, char *str)
{
    int i;
    a = 0;
    point = -1;
    for(i = 0; i < 6; ++ i)
    {
        if(str[i] == '.')
            point = i;
        else
            a = a * 10 + str[i] - '0';
    }
}
void solve(int a, int point, int N)
{
    BigNumber ans = BigNumber("1");
    int i;
    for(i = 0; i < N; ++ i)
        ans = ans * a;
    point = 5 - point;
    int m = (point == 6 ? 0 : point * N);//小数部分的位数
    int j = 0;
    while(!ans.data[j]) ++ j;//舍去尾部0
    if(ans.len > m)
    {
        if(j >= m)//尾部0延伸到整数部分
        {
            for(i = ans.len - 1; i >= m; -- i)
                printf("%d", ans.data[i]);
        }
        else
        {
            for(i = ans.len - 1; i >= m; -- i)
                printf("%d", ans.data[i]);
            printf(".");
            for(i = m - 1; i >= j; -- i)
                printf("%d", ans.data[i]);
        }

    }
    else //求出后大整数的位数小于小数的位数
    {
        printf(".");
        for(i = m - 1; i > ans.len - 1; -- i)
            printf("0");
        for(; i >= j; -- i)
            printf("%d", ans.data[i]);
    }
    printf("\n");
}
int main()
{
    freopen("f://data.in", "r", stdin);
    char str[10];
    int N;
    while(scanf("%s%d",str,&N) != EOF)
    {
        int a,point;
        init(a, point, str);
        solve(a, point, N);
    }
    return 0;
}


//方法二:
#include <cstdio>
#include <cstring>
const int nMax = 200;
struct BigNumber
{
    int data[nMax];
    int len;
    BigNumber(){len = 1; memset(data, 0, sizeof(data));}
    BigNumber(char *str){*this = str;}
    BigNumber & operator=(char *str);
    BigNumber operator*(int a);
    void clearLeadZero();
};
BigNumber & BigNumber::operator=(char *str)
{
    memset(data,0,sizeof(data));
    len = strlen(str);
    int i;
    for(i = 0; i < len; ++ i)
        data[i] = str[len - i - 1] - '0';
    return *this;
}
BigNumber BigNumber::operator *(int a)
{
    BigNumber z;
    int i;
    int q = 0;
    for(i = 0; i < len + 10; ++ i)
    {
        int p = data[i] * a + q;
        z.data[i] = p % 10;
        q = p / 10;
    }
    z.len = i;
    z.clearLeadZero();
    return z;
}
void BigNumber::clearLeadZero()
{
    while(len > 1 && !data[len - 1]) -- len;
}
void init(int &a, int &point, int &N, char *line)
{
	char str[10];
	sscanf(line, "%s", str);//主要为了找错
    int i;
    a = 0;
    point = -1;
    for(i = 0; i < 6; ++ i)
    {
        if(str[i] == '.')
            point = i;
        else
            a = a * 10 + str[i] - '0';
    }
    sscanf(line + 6,"%d",&N);
}
void solve(int a, int point, int N)
{
    BigNumber ans = BigNumber("1");
    int i;
    for(i = 0; i < N; ++ i)
        ans = ans * a;
    point = 5 - point;
    int m = (point == 6 ? 0 : point * N);//小数部分的位数
    int j = 0;
    while(!ans.data[j]) ++ j;//舍去尾部0
    if(ans.len > m)
    {
        if(j >= m)//尾部0延伸到整数部分
        {
            for(i = ans.len - 1; i >= m; -- i)
                printf("%d", ans.data[i]);
        }
        else
        {
            for(i = ans.len - 1; i >= m; -- i)
                printf("%d", ans.data[i]);
            printf(".");
            for(i = m - 1; i >= j; -- i)
                printf("%d", ans.data[i]);
        }

    }
    else //求出后大整数的位数小于小数的位数
    {
        printf(".");
        for(i = m - 1; i > ans.len - 1; -- i)
            printf("0");
        for(; i >= j; -- i)
            printf("%d", ans.data[i]);
    }
    printf("\n");
}
int main()
{
    freopen("f://data.in", "r", stdin);
    char line[20];
    while(gets(line))
    {
        int a,N,point;
        init(a, point, N, line);
        solve(a, point, N);
    }
    return 0;
}

你可能感兴趣的:(struct,测试)