UVA 748 - Exponentiation

取幂运算:本题考查了浮点数高精度取幂运算,题目很简单,我的思路是浮点数作积运算小数点的位数很重要,而积的小数点的位数等于因子的小数点的位数之和,知道这一点就确定了小数点的位置了,之后再进行前后去零处理(题目要求),即可。

代码如下(有待优化):

#include<stdio.h>
#include<string.h>
#define MAXN 20000
char a[7];
int n, num;
int A_1[MAXN], A[6], s[MAXN];
void solve()
{
int p = 5;
memset(A_1,0,sizeof(A_1));
for(int i = 0; i < 6; i ++)
{
if(a[i] == '.')
{
num = 5 - i;
num *= n;
}
if(a[i] >='0' && a[i] <= '9')
A[--p] = a[i] - '0';
}
A[5] = 0;
for(int i = 0; i < 5; i ++)
A_1[i] = A[i];
for(int u = 1; u < n; u ++)
{
memset(s,0,sizeof(s));
for(int i = 0; i < 6; i ++)
{
int c = 0;
for(int j = 0; j < MAXN; j ++)
{
s[i+j] += A_1[j] * A[i] + c;
c = s[i+j] / 10;
s[i+j] %= 10;
}
}
for(int i = 0; i < MAXN; i ++)
A_1[i] = s[i];
}
int i, j;
for(i = MAXN; i >= 0; i --)
if(s[i]||i == num) break;
for(j = 0; j <= i; j ++)
if(s[j]) break;
for(int p = i; p >= j; p --)
{
if(num == p&&p == i)
{
if(s[p]) printf("%d.",s[p]);
else
printf("."); continue;
}
printf("%d",s[p]);
if(num == p&&p != i) printf(".");
}
printf("\n");
}
void input()
{
while(scanf("%s%d",a,&n) == 2)
{
solve();
}
}
int main()
{
input();
return 0;
}



posted on 2012-02-29 21:30  BFP  阅读(528)  评论(0编辑  收藏  举报