POJ 1001

关键是处理好前导零和小数点末尾多余的零。

 

几组数据:

1.0000 1
10.000 1
10.000 2
0000.1 1
000001 1

输出:

1
10
100
.1
1

 

# include <iostream>
# include <cstring>
# include <cctype>

char base[10];
int n;

void solve(void)
{
    int point = 0;
    for ( ; base[point]!='.'; ++point) ;
    point = (5-point) * n;
    int b = 0;
    for (int i = 0; base[i] ; ++i) {
        if ( isdigit(base[i]) ) b = b*10 + (base[i]-'0');
    }
    if (b == 0) {
        std::cout << 0 << std::endl;
        return ;
    }
    char ans[300];
    memset(ans, 0, sizeof(ans));
    ans[0] = 1;
    for (int i= 0; i < n; ++i) {
        int carry = 0;
        for (int j = 0; j < 300; ++j) {
            int tmp = ans[j] * b + carry;
            carry = tmp / 10;
            ans[j] = tmp % 10;
        }
    }
    int i, j;
    for (i = 300-1; ans[i] == 0; --i) ;
    for (j = 0; j<point && ans[j] == 0; ++j);
    if (point > i) {
        std::cout << '.';
        for (int k = point-1 ; k > i; --k) std::cout << '0';
    }
    for ( ; i >= j; --i) {
        ans[i] += '0';
        std::cout << ans[i];
        if (i == point && point != j) std::cout << '.';
    }
    std::cout << std::endl;
}

int main()
{
    while (std::cin >> base >> n) {
        solve();
    }

    return 0;
}

 

posted @ 2013-10-18 12:32  努力变瘦  阅读(151)  评论(0编辑  收藏  举报