chenchen 题解分享 · 2025/3/11
R 格式(编程题) - 题解
快速幂+高精度 ``` #include <bits/stdc++.h> #define endl '\n' using namespace std; using ll = long long; using ULL = unsigned long long; const int N = 1e6+5; int n; string d; vector<int> mul(vector<int> &A, vector<int> &B) { vector<int> C(A.size() + B.size()); for(int i = 0; i < A.size(); i++) for(int j = 0; j < B.size(); j++) C[i + j] += A[i] * B[j]; for(int i = 0, t = 0; i < C.size(); i++) { t += C[i]; C[i] = t % 10; t /= 10; } while(C.size() > 1 && C.back() == 0) C.pop_back(); return C; } vector<int> qm(int a,int b) { vector<int> res; vector<int> aa; aa.push_back(a); res.push_back(1); for (; b; b >>= 1) { if (b & 1) res = mul(res,aa); aa = mul(aa,aa); } return res; } inline void solve() { cin >> n >> d; reverse(d.begin(),d.end()); int idx = d.find('.'); vector<int> D; for (int i = 0; i < d.length(); i++) if (i != idx) D.push_back(d[i] - '0'); vector<int> m = qm(2,n); vector<int> ans = mul(D,m); if (ans[idx-1] >= 5) ans[idx]++; for (int i = idx; i < ans.size()-1; i++) { ans[i+1] += ans[i]/10; ans[i] %= 10; } for (int i = ans.size()-1; i >= idx; i--) cout << ans[i]; } int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int _ = 1; //int _; cin >> _; while (_--) solve(); return 0; } ```
查看全文
2 0 0 3
thehanged 题解分享 · 2024/4/15
R 格式(编程题) - 题解
核心就是要将乘以2的n次方转换为累加的操作 证明 $$ x 2^{n} = x 2 2...2 = (x + x) 2...2 $$ ```cpp #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
zzczzczzc 题解分享 · 2024/4/17
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