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];
}
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];
}
相关文章推荐
- poj 1001 Exponentiation(高精度运算)
- poj 1001 Exponentiation(高精度运算)
- poj 1001 Exponentiation(高精度运算)
- poj 1001 Exponentiation(高精度运算)
- POJ 1001(高精度运算)
- poj 1001 Exponentiation(高精度运算)
- poj 1001 Exponentiation(高精度运算)
- ACM: 高精度运算 poj 1001 首次jav…
- poj 1001 Exponentiation(高精度运算)
- POJ1001高精度小数运算
- poj 1001 Exponentiation(高精度运算)
- poj 1001 Exponentiation(高精度运算)
- POJ 1001:Exponentiation —— 高精度浮点数运算
- POJ1001:高精度运算程序(X)
- poj 1001 Exponentiation(高精度运算)
- poj 1001 Exponentiation(高精度运算)
- poj 1001 Exponentiation(高精度运算)
- poj 1001 Exponentiation(高精度运算)
- POJ 1001 Exponentiation - 高精度高位数运算
- poj 1001 Exponentiation(高精度运算)