题解分享
题解分享简介
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
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
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



