连接:http://poj.org/problem?id=1001
大数乘法,一次就过了,目测跟去年相比做水题的能力真是提高不少
方法比较笨,就是首先转化成整数处理,再处理小数点,细心一点就好了
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int a[200], b[200], c[200]; int n_len, len1; int cal(int a1[200], int len1) { memset(c, 0, sizeof(c)); for(int i = 0; i < n_len; ++ i) { for(int j = 0; j < len1; ++ j) { c[i+j] += b[i]*a[j]; } } for(int i = 0; i < n_len + len1 - 1; ++ i) { c[i + 1] += c[i]/10; c[i] %= 10; a[i] = c[i]; } for(int i = n_len + len1 - 1; ; ++ i) { if(c[i] != 0) { a[i] = c[i]; } else { return i; } } return 0; } int main(){ freopen("poj1001.txt", "r", stdin); string str; int n; while(cin>>str>>n) { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); int pos = -1, cnt = 0; for(int i = str.length() - 1; i >= 0; -- i) { if(str[i] == '.') { pos = str.length() - 1 - i; }else{ b[cnt] = a[cnt] = str[i] - '0'; cnt++; } } len1 = n_len = cnt; if(pos < 0) { pos = 0; } for(int i = 1; i < n; ++ i) { len1 = cal(a, len1); } while(len1 >= 0 && a[len1] == 0) { len1--; } if(len1 < 0) { printf("0\n"); } else { pos = pos*n; if(pos == 0) { for(int i = len1; i >= 0; -- i) { printf("%d", a[i]); } printf("\n"); } else { int count = 0; string result; if(len1 < pos) { printf("."); while(pos - 1 - len1 > 0) { printf("0"); pos--; } for(int i = len1; i >= 0; -- i) { printf("%d", a[i]); } printf("\n"); } else { int min = 0; while(min < pos && a[min] == 0) { min++; } for(int i = len1; i >= pos; -- i) { printf("%d", a[i]); } if(min < pos) { printf("."); for(int i = pos - 1; i >= min; -- i) { printf("%d", a[i]); } } printf("\n"); } } } } return 0; } |