您的位置:首页 > 其它

POJ1001 Exponentiation

2013-07-28 23:51 363 查看
题目来源:http://poj.org/problem?id=1001

题目大意:给出一个0.0至99.999 之间的实数R和一个1至25之间的整数,求Rn。

输入:一组R和n,每行的第1行至第6列为R,第8列至第9列为n。

输出:每行表示一个Rn的实际值。

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


解题关键:

 1. 所求得的结果很可能超出了C/C++等语言标准类型的表达范围,所以需要以字符串来保存结果。

 2. 显然可以将指数运算用连乘来实现。

3. 用倒序保存中间结果比较方便,可以避免进位时产生移位的操作。

//////////////////////////////////////////////////////////////////////////
//        POJ1001 Exponentiation
//        Memory: 284K        Time: 0MS
//        Language: C++        Result: Accepted
//////////////////////////////////////////////////////////////////////////

#include <iostream>

using namespace std;

int result[130];    //保存结果

//将当前结果与底数相乘一次更新结果
void multiply(int multiplier) {

//辅助数组
int temp[130];
for (int i = 0; i < 130; i++) {
temp[i] = 0;
}

for (int i = 0; i < 125; i++) {
int t = result[i] * multiplier;    //第i位与乘数相乘
int carry = (t + temp[i]) / 10;    //剩余数
temp[i] = (t + temp[i]) % 10;    //计算第i位

//依次处理高位
int g = 1;
while (carry) {
int t = temp[i + g] + carry;
carry = t / 10;
temp[i + g] = t % 10;
g++;
}
}
for (int i = 0; i < 130; i++) {
result[i] = temp[i];
}
}

//输出
void output(int sign) {
int start = 0;
int end = 129;
//寻找不为0的最高位
for (int i = 0; i <= sign && i <= 129; i++) {
start = i;
if (result[i] != 0)    {
break;
}
}

//寻找不为0的最低位
for (int i = 129; i >= 0; i--) {
if (i == sign - 1) {
end = i;
break;
}
if (result[i] != 0) {
end = i;
break;
}
}

//依序输出各位
for (int i = end; i >= start; i--) {
if (i == sign - 1) {
cout << '.';
}
cout << result[i];
}
cout << endl;
}

int main(void)
{
char c;

while ((c = getchar()) != EOF) {
int multiplier = 0;    //记录底数(以整数形式记,不考虑小数点)
int sign = 0;    //记录小数点位置
int index = 4;

//结果所有位初始化为0
for (int i = 0; i < 130; i++) {
result[i] = 0;
}

//处理输入
for (int i = 1; i <= 5; i++) {
if (c == '.') {
//读入的位为小数点,记录小数点位数
sign = i;
} else {
//读入的位为数字,计算底数
multiplier = multiplier * 10 + (c - '0');
//倒序保存至初始结果
result[index--] = int(c - '0');
}
c = getchar();
}
//处理最后一位
if (c == '.') {
sign = 6;
} else {
multiplier = multiplier * 10 + (c - '0');
result[index--] = int(c - '0');
}
//计算小数点后位数
sign = 6 - sign;

//n为指数
int n = 0;
cin >> n;

//连乘
for (int i = 1; i < n; i++) {
multiply(multiplier);
}

//计算小数点位置
sign = sign * n;
output(sign);
getchar();  //去回车符
}
system("pause");
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: