//4_7_25: Exponentiation 求实数R的n此方 POJ1001
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int i,j,k,n,cnt,start,end,sign,dec,temp,carry,Integer;
int R[10],ans[200],tep[200],ans_cnt,tep_cnt;
char str[10];
while(scanf("%s%d",str,&n) != EOF)
{
i = 0;
cnt = 0;
Integer = 0;
start = 0;
while(str[start] == '0' || str[start] == '.') start ++;
end = strlen(str) - 1;
while(str[end] == '0' || str[end] == '.') end --;
while(str[i])
{
if(str[i] == '.')
{
sign = i;
break;
}
i++;
}
if(i == strlen(str)) sign = i; //这个数连点都没有
if(sign > end)
{
Integer = 1;
for(i = start ;i < sign;i ++) R[cnt++] = (int)(str[i] - '0');
}
else if(end > sign)
{
for(i = start;i <= end;i ++)
if(str[i] != '.')
R[cnt++] = (int)(str[i] - '0');
dec = end - sign;
}
for(i = 0,j = cnt - 1;i < j;i ++,j --)
{
temp = R[i];
R[i] = R[j];
R[j] = temp;
}
for(i = 0;i < cnt;i ++) ans[i] = R[i];
ans_cnt = cnt;
for(k = 1;k < n;k ++)
{
for(i = 0;i < ans_cnt;i ++) tep[i] = ans[i];
tep_cnt = ans_cnt;
for(i = 0;i < cnt + tep_cnt;i ++) ans[i] = 0;
for(i = 0;i < cnt;i ++)
{
carry = 0;
for(j = 0;j < tep_cnt;j ++)
{
temp = carry;
carry = (ans[i + j] + tep[j] * R[i] + temp) / 10;
ans[i + j] = (ans[i + j] + tep[j] * R[i] + temp) % 10;
}
if(carry)
{
ans[i + j] = carry;
ans_cnt = i + j + 1;
}
else ans_cnt = i + j;
}
}
if(Integer)
{
for(i = ans_cnt - 1;i >= 0;i --) printf("%d",ans[i]);
printf("\n");
continue;
}
if(ans_cnt > dec * n)
{
for(i = ans_cnt - 1;i >= dec * n;i --) printf("%d",ans[i]);
printf(".");
for(;i >= 0;i --) printf("%d",ans[i]);
printf("\n");
}
else
{
printf(".");
for(i = 0;i < dec * n - ans_cnt;i ++) printf("0");
for(i = ans_cnt - 1;i >=0;i --) printf("%d",ans[i]);
printf("\n");
}
}
return 0;
}
/*测试结果:通过POJ1001检测
10 12
1000000000000
1.0100 12
1.126825030131969720661201
0.0123 6
.000000000003462825991689
98.0 3
941192
0.4321 20
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
^Z
请按任意键继续. . .
*/
POJ1001 Exponentiation
最新推荐文章于 2018-11-18 00:31:25 发布