题意是求R的n次方,R为0.0 到 99.999 的小数。
几个细节,一个是小数点的摆放位置;一个是小数点后无效的零要去掉;一个是结果的前导零和后导零都要去掉;还有一个是如果结果是整数,不输出小数点。
一个技巧,直接用一个base保存原来的数,省去不少空间,还降低了代码的复杂度。酷炫到没朋友。
代码:
#include
#include
using namespace std;
const int Maxn = 200;
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
int s[Maxn];//记录最终结果
char R[7];//底数
int n;//幂
while (cin >> R >> n)
{
int base = 0;//记录去小数点后的数字
int dot = -1;//记录小数点
for (int i = 0; i < 6; i++)
{
if (R[i] == '.')
{
dot = 6- 1 - i;
}
else
{
base = base * 10 + R[i] - '0';
}
}
//printf("%d\n", base);
//处理小数点后无效零的情况
if (dot)
{
for (int i = 5; R[i] == '0'; i--)
{
base /= 10;
dot--;
}
}
//printf("%d\n", base);
//结果的小数的位数
dot *= n;
//printf("%d\n", dot);
//把base赋值入数组num[]中,为大数乘法做准备
int tmp = base;
for (int i = 0; i < Maxn; i++)
{
s[i] = tmp % 10;
tmp /= 10;
}
//乘法运算
for (int j = 1; j < n; j++)
{
int jinwei = 0;
for (int i = 0; i < Maxn; i++)
{
s[i] = s[i] * base + jinwei;
jinwei = s[i] / 10;
s[i] %= 10;
}
}
int len = Maxn - 1;
/*for (; len >= 0; len--)
if (s[len]) break;*/
while (!s[len])
len--;
if (dot > len)//结果无整数部分
{
cout << ".";
for (int i = dot - 1; i >= 0; i--)
cout << s[i];
}
else//结果有整数部分
{
for (; len > dot - 1; len--)
cout << s[len];
if (len >= 0)
cout << ".";
for (; len >= 0; len--)
cout << s[len];
}
cout << endl;
}
return 0;
}