#include <iostream> //大数相加
using namespace std;
#define max 200
int main(void)
{
int arr[max] = {0}, n, set = 0;
char cArr[20]; //存输入的字符串
while (cin >> cArr >> n)
{
int cLen = strlen(cArr), pointNum, base = 0;
for (int i = 0; i < cLen; ++i)
{
if (cArr[i] == '.') pointNum = cLen -i - 1;
else base = base * 10 + cArr[i] - '0';//利用距离表示数,很机智,相当于去掉小数点表示整个数
}
if(pointNum)//完美承接上面的base值,去掉输入数据小数点后面最尾部多余的零,它们影响计算
{
int i = cLen -1;
while (cArr[i] == '0')
{
base /= 10;
--i; --pointNum;
}
}
pointNum *= n; //总的小数位 小数想乘符合加法
for (int i = 0, q = base; i < max; ++i) //数据反着放的,这就是结果 200长度,怎么存都够了
{
arr[i] = q % 10; //把 base 复制到数组 cArr
q /= 10;
}
for (int i = 0; i < n - 1; ++i) //核心算法 数据倒着放?
{
for (int j = 0; j < max; ++j)
{
arr[j] = arr[j] * base + set;
set = arr[j] / 10;
arr[j] = arr[j] % 10;
}
}//计算,结果保留在数组 a 中
//
int i = 0;
for (i = max - 1; i >= 0; --i)//首个不为零的{
if (arr[i] != 0) break;
if (pointNum > i) // only in this condition 全小数
{
cout << ".";
for (int j = pointNum - 1; j >= 0 ; --j)
cout << arr[j];//果然是倒序存储
}
else //有整数部分
{
for (; i > pointNum - 1; --i)
cout << arr[i];
if (i >= 0 )
cout << ".";
for (; i >= 0 ; --i)
cout << arr[i];
}
cout << endl;
}
system("pause");
return 0;
}
POJ 1001
最新推荐文章于 2020-08-17 11:20:42 发布