はまやんはまやんはまやん

hamayanhamayan's blog

Barnicle [Codeforces 362 : Div2 B]

問題

http://codeforces.com/contest/697/problem/B

「a.deb」形式として、整数 a 実数 d 自然数 b が与えられるとき、
a.d * 10^b を出力せよ。

0 <= a <= 9
0 <= d < 10^100
0 <= b <= 100

考察

1. 10^100なので文字列として扱えば良さそう
2. aとdをそのままくっつけると、aは1桁で決まっているので、0番目と1番目の間にコンマが来る
3. あとは、そのコンマを b だけ右に移動させる
4. 先頭や末尾の0や小数以下が無いときにコンマを消せば答え

実装

http://codeforces.com/contest/697/submission/19125229

string s;
//-----------------------------------------------------------------
string a;
string d;
int b;
void parse() {
	int id = s.find(".");
	a = s.substr(0, id);

	int ie = s.find("e");
	d = s.substr(id + 1, ie - id - 1);

	b = 0;
	rep(i, ie + 1, s.length()) b = b * 10 + (s[i] - '0');
}
//-----------------------------------------------------------------
#define rrep(i,a,b) for(int i=a;i>=b;i--)
string zeroclear(string x) {
	int l = 0;
	rep(i, 0, x.length()) {
		if (x[i] == '0')
			l = i + 1;
		else
			break;
	}

	int r = x.length() - 1;
	rrep(i, x.length() - 1, 0) {
		if (x[i] == '0')
			r = i - 1;
		else
			break;
	}

	return x.substr(l, r - l + 1);
}
//-----------------------------------------------------------------
int main() {
	while (cin >> s)
	{
		parse();

		/*cout << a << endl;
		cout << d << endl;
		cout << b << endl;*/

		if (d.length() < b) {
			int dif = b - d.length();
			rep(i, 0, dif) d = d + "0";
		}

		string ad = a + d;
		string ans = "";
		rep(i, 0, ad.length()) {
			ans += ad[i];
			if (i == b) ans += ".";
		}

		//cout << ans << endl;//
		ans = zeroclear(ans);


		if (ans[0] == '.') ans = "0" + ans;
		if (ans[ans.length() - 1] == '.') ans = ans.substr(0, ans.length() - 1);

		cout << ans << endl;
	}
}