POJ 百练1001 提示与参考

POJ不提供后台的测试数据,但是这道题的测试数据很可能包含:

10.0

0.0

1.1

0.1

...

这类数据。


实现的方法:

1、先实现长整数的乘法(不细说)

2、在实现在结果中添加小数点:分三种情况,小数位数k=0,k<=整数数位m,k>m。


心得:

这道题不要太计较程序的速度,因为数据的量相比计算机的计算能力还是较小的。

因此可以多运用string函数库中的诸如insert、erase看似效率低的函数,简化实现难度,还是可以过的。

长整数乘法的过程中先将字符转变为数字,中间数据用字符来保存会造成溢出。


#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <stack>
using namespace std;

string dajiaxiao(string a, string b) {
	int alen = a.size(), blen = b.size();
	for (int i = 1; i <= b.size(); i++) {
		a[a.size() - i] += b[b.size() - i];
		a[a.size() - i] -= '0';
	}
	for (int i = 1; i < a.size(); i++) {
		if (a[a.size() - i] > '9') {
			a[a.size() - i - 1] += 1;
			a[a.size() - i] -= 10;
		}
	}
	if (a[0] > '9') { a[0] -= 10; a.insert(0, "1"); }
	return a;
}

string jia(string a, string b) {
	int alen = a.size(), blen = b.size();
	if (alen >= blen)return dajiaxiao(a, b);
	else return dajiaxiao(b, a);
}

string dachengxiao(string a,string b){
	string tmp = "0"; string aa = a;
	for (int i = b.size() - 1; i >= 0; i--) {
		for (int j = 0; j < a.size(); j++) {
			a[j] = (a[j] - '0')*(b[i] - '0');
		}
		for (int j = a.size() - 1; j > 0; j--) {
			a[j - 1] += a[j]/ 10;
			a[j] = a[j]% 10;
		}
		if (a[0] > 9) {
			char c = a[0] / 10;
			a[0] = a[0] % 10;
			string sc = ""; sc += c;
			a.insert(0, sc);
		}
		for (int j = 0; j < a.size(); j++)a[j] += '0';
		tmp = jia(tmp, a);
		aa=aa + '0';
		a = aa;
	}
	//cout << "tmp " << tmp << endl;
	return tmp;
}
string cheng(string a, string b) {
	int alen = a.size(), blen = b.size();
	if (alen >= blen)return dachengxiao(a, b);
	else return dachengxiao(b, a);
}

int main()
{
	string input;
	while (getline(cin, input)) {
		stringstream depart(input);
		string num; int lev;
		depart >> num; depart >> lev;

		for (int i = num.size() - 1; i >= 0; i--) {
			if (num[i] == '0')num.erase(i, 1);
			else break;
		}
		for (int i = 0; i < num.size(); i++) {
			if (num[i] == '0') {
				num.erase(i, 1); i--;
			}
			else break;
		}
		int k = 0;
		for (int i = num.size()-1; i >=0; i--) {
			if (num[i] == '.') { num.erase(i, 1); break; }
			else k++;
		}
		if (num == "")num = "0";
		string num2 = num;
		for (int i = 1; i < lev; i++) {
			num2 = cheng(num2, num);
		}

		k *= lev;

		if (k == 0) {
			cout << num2 << endl;
		}
		else if (k <= num2.size()) {
			num2.insert(num2.size() - k, ".");
			cout << num2 << endl;
		}
		else if (k > num2.size()) {
			cout << '.';
			for (int i = 0; i < k - num2.size(); i++)cout << '0';
			cout << num2 << endl;
		}
	}
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值