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

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;
}
2 回复 0 转发 0 喜欢 12 阅读
回复 (2)
默认 最新
露米 2026/2/17
谢谢你分享的题解。

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

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

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

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

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

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

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

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