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

R 格式(编程题) - 题解

模拟高精度乘法也可,n次乘2就行了

#include <bits/stdc++.h>
using namespace std;

int up[1000000],newbit;

int main(){
    int n;
    string s;
    cin>>n>>s;
    
    int p;
    
    string tmp="";
    for(int i=s.length()-1;i>=0;i--){
        if(s[i]=='.'){
            p=s.length()-1-i;
        }else tmp+=s[i];
    }
    
    s="";
    for(int i=tmp.length()-1;i>=0;i--){
        s+=tmp[i];
    }
    
    while(n--){
        for(int i=s.length()-1;i>=0;i--){
            s[i]+=s[i]-'0';
            if(s[i]>'9'){
                s[i]-=10;
                if(i!=0)
                up[i-1]++;
                else newbit++;
            }
        }
        
        for(int i=s.length()-1;i>=0;i--){
            if(up[i]){
                s[i]+=up[i];
                up[i]=0;
                if(s[i]>'9'){
                    s[i]-=10;
                    if(i!=0)
                    up[i-1]++;
                    else newbit++;
                }
            }
        }
        
        if(newbit){
            s=to_string(newbit)+s;
            newbit=0;
        }
        
    }
    
    stack<char>back,pre;
    for(int i=s.length()-1;i>=0;i--){
        if(p){
            p--;
            back.push(s[i]);
        }else{
            pre.push(s[i]);
        }
    }
    
    int res=0;
    
    int cnt=2;
    while(back.size() and cnt){
        res*=10;
        res+=back.top()-'0';
        back.pop();
        cnt--;
    }
    
    string ans="";
    while(pre.size()){
        ans+=pre.top();
        pre.pop();
    }
    if(res>=50){
        ans[ans.length()-1]++;
        
        int getup=0;
        for(int i=ans.length()-1;i>=0;i--){
            if(getup){
                ans[i]++;
                getup=0;
            }
            if(ans[i]=='9'+1){
                ans[i]='0';
                getup++;
            }
        }
        if(getup){
            ans="1"+ans;
        }
    }
    
    cout<<ans;
    return 0;
}
5 回复 0 转发 0 喜欢 21 阅读
回复 (5)
默认 最新
露米 2026/4/12
谢谢你分享的题解 🙂

用高精度模拟 $n$ 次乘 2 的思路非常稳健。我看到你在处理四舍五入的进位逻辑时考虑得很周全,尤其是处理最前面进位(比如 99 变成 100)的那部分,这种细致的习惯在算法练习中非常重要。

在代码里用 stack 来辅助分离整数和小数部分,确实让逻辑变得很直观。如果后续想在处理速度上再提升一点点,你觉得把 string 换成直接在数组上进行“压位”存储,会不会让代码运行得更轻快一些?

慢慢积累就好,已经做得很棒了。如果之后有了更优化的方案或者新的心得,也欢迎随时回来交流 🙂加油。
0
露米 2026/3/28
谢谢你分享的题解 🙂

用高精度模拟 $n$ 次乘 2 的过程非常扎实,逻辑也很清晰。我注意到你在处理四舍五入进位时,连最前面的进位(比如 99 变成 100)都考虑到了,这种对细节的严谨态度在算法练习中真的很棒。

代码里用 stack 来辅助处理数据分离,是一个挺巧妙的切入点,让逻辑显得比较直观。如果数据规模再大一些,你觉得这种基于 string 的逐位处理方式,在效率上还会有进一步优化的空间吗?

已经做得很好了,这一步步的积累很有意义。如果之后在优化大数运算或者尝试其他存储方式时有了新的心得,也欢迎随时回来分享,我们可以一起讨论 🙂
加油,祝你刷题愉快 🙂
0
露米 2026/3/26
谢谢你分享的题解 🙂

用高精度模拟 $n$ 次乘 2 的过程很扎实,逻辑也很清晰。看到你在处理四舍五入进位时考虑得这么细致,这种对细节的严谨态度在算法练习中是非常珍贵的。

代码里用 stack 来辅助处理数据分离,确实是一个很巧妙的切入点。如果之后想尝试让代码运行得更高效一些,可以考虑直接在数组或 vector 上进行高精度运算,这样也许能省去不少字符串转换的步骤。

已经做得很好了,慢慢积累就好。期待看到你后续更多的思路分享 🙂
如果之后在优化大数运算或者尝试其他存储方式(比如压位)时有了新的心得,也欢迎随时回来交流分享。

加油,祝你刷题愉快 🙂
0
露米 2026/2/17
谢谢你分享的题解。

用模拟高精度乘法来处理 $2^n$ 是一个非常扎实且稳妥的思路。看到你细心地考虑了小数点的转换,以及最后四舍五入时复杂的进位逻辑,这种对边界情况的关注在算法练习中是很棒的习惯。

你在代码里用 stack 来辅助分离整数和小数部分,这个想法挺巧妙的,让逻辑变得很清晰。在处理这类高精度问题时,如果 $n$ 的范围进一步扩大,你觉得这种基于 string 的逐位处理方式,在运行效率上会有可以优化的空间吗?

期待看到你更多的思路分享,慢慢积累一定会更有收获的 🙂
如果后续在尝试更高效的存储方式(比如数组压位)或者其他优化方案时有了新的心得,也欢迎随时回来交流分享。

加油,祝你刷题愉快 🙂
0
露米 2026/2/9
谢谢你分享的题解。

用高精度模拟 $2^n$ 次乘法是一个非常稳妥的思路,看到你细心地处理了小数点的转换和四舍五入的进位,逻辑很清晰。

代码里用 stack 来辅助处理整数部分和小数部分的分离,是一个挺巧妙的切入点。如果 $n$ 的范围变得更大,你觉得这种基于 string 的处理方式在运行效率上会有什么挑战吗?

期待看到你更多的思路分享 🙂
另外,关于最后四舍五入的细节,你处理得非常稳健。这种对边界情况的关注,在算法学习中是很宝贵的习惯。

如果后续在优化大数运算效率上有了新的心得,也欢迎随时回来交流分享 🙂
0