您的位置:首页 > 其它

POJ 1001 高精度指数运算

2013-12-31 00:31 330 查看
本来觉得很简单的题,兴冲冲做了,结果各种Wrong Answer,搞了几周看到AC真是感慨啊,细节决定成败。

1.这道题目还是比较简单的,但是细节还是挺麻烦的,提交了几次才通过。

2.思路:用数组表示大数,采用最简单的多次乘法,需要注意的是进位的处理,还有输出的时候要严格符合数据的要求。

一开始,数组采用了高位在前,低位在后,也就是x[0]存储高位,x[MAXLEN]存储低位的存储方式,但是这样处理很繁琐,

后来,反转了数组的存储,发现计算起来很方便,只需要在输出的时候注意处理一下就行了。

/**************************************
* Author:
* Date: 2013.12.17
* Result = r^n
* 0.0 < r < 99.999, 0 < n <= 25
**************************************/
#include <stdio.h>

#define RLEN 6
#define MAXLEN 125

void calcMul(int x[], int y[]);

int main()
{
char r[7];
int n, i, j, dotLen, state, nPos;
int x[MAXLEN], y[MAXLEN];

while (scanf("%s %d", r, &n) != EOF){
// initialization
for(i = 0; i < 125; ++i){
x[i] = 0;
y[i] = 0;
}

state = 0;
for(i = 0; i < 6; ++i){
if(r[i] == '.'){
state = 1;
break;
}
}

for(i = 6; i >= 0; --i){
if(r[i] == '\0'){
if(state == 0)
r[i] = '.';
else
r[i] = '0';
break;
}
r[i] = '0';
}
state = 0;

// read from stdin of revert num
dotLen = 0;
for(i = RLEN - 1, j = 0; i >= 0; --i){
if(r[i] != '.'){
x[j] = r[i] - '0';
y[j++] = r[i] - '0';
}
else
dotLen = (RLEN - 1 -i) * n;
}

// calc
for(i = 0; i < n - 1; ++i)
calcMul(x, y);

// putout
state = 0;
for(i = 0; i < MAXLEN; ++i){
if(y[i] != 0){
nPos = i;
break;
}
}
if(nPos > dotLen)
nPos = dotLen;

for(i = MAXLEN - 1; i >= nPos; --i){
if(i == dotLen - 1 && (state == 1 || (MAXLEN - i) < dotLen)){
printf(".");
state = 1;
}

if(y[i] > 0 || state == 1){
printf("%d", y[i]);
state = 1;
}
}
printf("\n");
}

return 0;
}

void calcMul(int x[], int y[])
{
int temp[MAXLEN];
int xLen, yLen, i, j;

// initialization
for(i = 0; i < MAXLEN; ++i)
temp[i] = 0;

for(i = MAXLEN - 1; i >= 0; --i){
if(x[i] != 0){
xLen = i + 1;
break;
}
}

for(i = MAXLEN - 1; i >= 0; --i){
if(y[i] != 0){
yLen = i + 1;
break;
}
}

// calc
for(i = 0; i < xLen; ++i){
for(j = 0; j < yLen; ++j){
temp[i + j] += x[i] * y[j];
}
}

// carry
for(i = 0; i < MAXLEN - 1; ++i){
temp[i + 1] += temp[i] / 10;
temp[i] %= 10;
}

for(i = 0; i < MAXLEN; ++i)
y[i] = temp[i];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: