POJ 1001

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值