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; }