标签:高精度
Description
Input
Output
Sample Input
95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201
解题思路:
题目大意就是给两个数A,B,求A的B次方。唯一难点就是含有了小数点,首先得去掉小数点,但得记住小数点的位置。然后就行乘方。得出答案后再根据小数点的位置把小数点加上去。小数部分末尾的零不能留,整数部分的前导零也不能留,还有整数部分如果为0,直接输出小数点再输出小数部分。注意这几点就行了。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 200; int main() { int n, ans[maxn], num, xiao[maxn], zheng[maxn]; char R[maxn], str[10]; while(scanf("%s", R) != EOF) { int pos = 0, k_1 = 0, k_2 = 0, k_3 = 0; memset(ans, 0, sizeof(ans)); memset(xiao, 0, sizeof(xiao)); memset(zheng, 0, sizeof(zheng)); scanf("%d", &n); for(int i = 0; i < 6; i++) { if(R[i] != '.') str[k_1++] = R[i]; if(R[i] == '.') pos = i; } str[k_1] = 0; sscanf(str,"%d", &num); // 把字符串化为整数 for(int i = 0; i < 5; i++) ans[i] = str[5 - i - 1] - '0'; for(int i = 0; i < n - 1; i++) // 求出答案 { int d = 0; for(int j = 0; j < maxn; j++) { ans[j] = num * ans[j] + d; d = ans[j] / 10; ans[j] %= 10; } } bool isBegin = false; for(int i = 0; i < n * (5 - pos); i++) // 找出小数部分 { if(isBegin) { xiao[++k_2] = ans[i]; } else if(ans[i]) { xiao[0] = ans[i]; isBegin = true; } } isBegin = false; for(int i = maxn - 1; i >= n * (5 - pos); i--) // 找出整数部分 { if(isBegin) { zheng[++k_3] = ans[i]; } else if(ans[i]) { zheng[0] = ans[i]; isBegin = true; } } if(zheng[0]) // 判断是否要输出整数部分 { for(int i = 0; i <= k_3; i++) printf("%d",zheng[i]); } if(xiao[k_2] == 0 && k_2 == 0) //判断是否要输出小数部分 { printf("\n"); continue; } printf("."); for(int i = k_2; i >= 0; i--) printf("%d",xiao[i]); printf("\n"); } return 0; }
Exponentiation(高精度),布布扣,bubuko.com
标签:高精度
原文地址:http://blog.csdn.net/userluoxuan/article/details/38317623