/* 题意:输入一个小数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; }