1. 题目大意
考察大数运算,有些时候由于编译器所能接受单个变量大小有限,需要单独编写程序完成运算。
该题是完成Rb的指数运算,其中0<=R<=99.999 , 0<b<=25。
2. AC难点
输出格式:纯小数不需要输出小数点前的零;不能省略小数点后的必须零;表示精度的多余零必须省略。
3. 大体思路
1.将数字按位整型存储;
2.多位乘法的实质是错位乘加;
3.为了防止溢出,每次运算后再次将所有位数化为整形(进位)
4.完善的输出函数(防止输出错误)
4. 代码
#include <iostream>
using namespace std;
int res[6];
class zhishu
{
public:
int arr[150]; //小数点前50位,小数点后75位
int high, low;
void init()
{
high = 48;
low = 53;
for (int i = 0; i < 150; i++)
arr[i] = 0;
}
void set(int *nums)
{
for (int i = 1; i < 6; i++)
arr[48 + i - nums[0]] = nums[i];
format();
}
void format()
{
int i, co = 0;
for (i = low + 4; i > high - 3; i--)
{
arr[i] = arr[i] + co;
co = arr[i] / 10;
arr[i] = arr[i] % 10;
}
i = 0;
while (arr[i] == 0 && i < 150)
{
i++;
}
high = i;
i = 149;
while (arr[i] == 0 && i >= 0)
{
i--;
}
low = i;
}
void multi(int *nums)
{
int i, temp[150] = { 0 };
for (i = high; i < low + 1; i++)
for (int j = 1; j < 6; j++)
temp[i - nums[0] + j - 1] = temp[i - nums[0] + j - 1] + nums[j] * arr[i];
for (i = high - nums[0]; i < low - nums[0] + 5; i++)
arr[i] = temp[i];
format();
}
void print_exp()
{
int i;
if (high > low)
cout << 0;
else if (high > 49)
{
printf_s(".");
for (i = 50; i < low + 1; i++)
{
cout << arr[i];
}
}
else if (low < 50)
{
for (i = high; i < 50; i++)
cout << arr[i];
}
else
{
for (i = high; i < 50; i++)
cout << arr[i];
printf_s(".");
for (i = 50; i < low + 1; i++)
cout << arr[i];
}
cout << '\n';
}
};
void trans(char *input)
{
int i, j = 1;
res[0] = 5;
for (i = 0; i < 6; i++)
{
if (input[i] == '.')
res[0] = i - 1;
else
{
res[j] = input[i] - 48;
j++;
}
}
}
int main()
{
int expo;
zhishu result;
char input[7];
int i;
while (cin >> input >> expo)
{
result.init();
trans(input);
result.set(res);
for (i = 0; i < expo - 1; i++)
{
result.multi(res);
}
result.print_exp();
}
}
5. 测试输入集
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
.00001 1
.12345 1
0001.1 1
1.1000 1
10.000 1
000.10 1
000000 1
000.00 1
.00000 0
000010 1
000.10 1
0000.1 1
00.111 1
0.0001 1
0.0001 3
0.0010 1
0.0010 3
0.0100 1
0.0100 3
0.1000 1
0.1000 3
1.0000 1
1.0000 3
1.0001 1
1.0001 3
1.0010 1
1.0010 3
1.0100 1
1.0100 3
1.1000 1
1.1000 3
10.000 1
10.000 3
10.001 1
10.001 3
10.010 1
10.010 3
10.100 1
10.100 3
99.000 1
99.000 3
99.001 1
99.001 3
99.010 1
99.010 3
99.100 1
99.100 3
99.998 1
99.998 3