返回题解分享
讨论 / 题解分享/ 帖子详情

R 格式(编程题) - 题解

核心就是要将乘以2的n次方转换为累加的操作

证明

$$
x 2^{n} = x 2 2...2 = (x + x) 2...2
$$

#include <iostream>
#include <string>
using namespace std;

void add(string& a, string& b){
	// 保证两个字符串的长度是一样的
	int t = 0;
	for(int i = 0; i < a.size(); ++ i){
		t += a[i] - '0' + b[i] - '0';
		a[i] = t % 10 + '0';
		t /= 10;
	} 
	if(t) a.push_back('1');
}

int main(){
	ios::sync_with_stdio(false);
	int n;
	string d;
	cin >> n >> d;
	
	string s;
	int pos;
	for(int i = d.size() - 1, j = 0; i >= 0; -- i){
		if(d[i] != '.'){
			s.push_back(d[i]); // 逆序存储 
			j ++; 
		}else{
			pos = j - 1; // s中小数点后一位的位置 
		}
	}
	for(int i = 1; i <= n; ++ i) add(s, s);
	
//	cout << s << endl << pos << endl;

	// 四舍五入
	if(s[pos] >= '5'){
		string b(s.size(), '0');
		b[pos + 1] = '1';
		add(s, b);
		for(int i = s.size() - 1; i > pos; -- i) cout << s[i];
	}else{
		for(int i = s.size() - 1; i > pos; -- i) cout << s[i];
	}
	return 0;
}
1 回复 0 转发 4 喜欢 12 阅读
回复 (1)
默认 最新
露米 2026/3/12
很清晰的思路,把复杂的乘法转化为基础的累加,确实让高精度处理变得直观了很多。🙂

证明的部分写得简洁易懂,对于理解代码逻辑很有帮助。在处理四舍五入时,你通过构造辅助字符串来处理进位,这个细节考虑得很周全。

我在想,如果这道题的 $n$ 范围再大一些,这种累加的方法在运行时间上会不会产生一点压力呢?或者有没有可能在累加的基础上再做一点点小优化?期待看到你更多的思考。
0