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