網(wǎng)站做哪些主題比較容易做幽默廣告軟文案例
本題鏈接:藍(lán)橋杯2024年第十五屆省賽真題-R 格式 - C語(yǔ)言網(wǎng)
題目:???????
樣例:
|
13 |
思路:
? ? ? ? 根據(jù)題意,結(jié)合數(shù)據(jù)范圍,這是一道模板的高精度乘以低精度問(wèn)題。
? ? ? ? 題意是double 類(lèi)型 d 與 2 的n 次冪相乘,最后四舍五入。
????????我們換一下視角,看作 對(duì)于double 類(lèi)型 d ,與 n 個(gè) 2 相乘,最后四舍五入。
? ? ? ? 這樣就很快解出答案了,就是對(duì)于double小數(shù)部分需要微調(diào)一下即可。
高精度乘法模板函數(shù)如下:
????????
// 高精度乘以低精度 模板
inline string mul(string A,int x)
{vector<int>a; // 取出每一位int len = A.size(); // 倒著取每一位,方便低位到高位的計(jì)算for(int i = len - 1;~i;--i) a.emplace_back(A[i] - '0');vector<int>tem; // 存儲(chǔ)計(jì)算結(jié)果int t = 0; // 存儲(chǔ)臨時(shí)進(jìn)位數(shù)for(int i = 0;i < len;++i){int num = t + a[i] * x; // 開(kāi)始每一位相乘tem.emplace_back(num % 10); // 取計(jì)算結(jié)果個(gè)位t = num / 10; // 計(jì)算進(jìn)位}if(t) tem.emplace_back(t); // 如果最后有高位的進(jìn)位,我們進(jìn)位string ans = ""; // 存儲(chǔ)最后計(jì)算結(jié)果// 將結(jié)果轉(zhuǎn)回為 string ,并返回結(jié)果int temlen = tem.size();for(int i = temlen - 1;~i;--i) ans += char(tem[i] + '0');return ans;
}
? 高精度加法模板函數(shù)如下:
// 高精度加法模板
inline string ADD(string A,string B)
{vector<int>a,b;int alen = A.size();int blen = B.size();// 倒著取每一位,方便低位到高位的計(jì)算for(int i = alen - 1;~i;--i) a.emplace_back(A[i] - '0');for(int i = blen - 1;~i;--i) b.emplace_back(B[i] - '0');vector<int>tem; // 存儲(chǔ)計(jì)算結(jié)果int t = 0; // 存儲(chǔ)臨時(shí)進(jìn)位數(shù)for(int i = 0;i < alen or i < blen;++i){int num = t; // 開(kāi)始每一位相加if(i < alen) num += a[i];if(i < blen) num += b[i];tem.emplace_back(num % 10);// 取計(jì)算結(jié)果個(gè)位t = num / 10;// 計(jì)算進(jìn)位}if(t) tem.emplace_back(t); // 如果最后有高位的進(jìn)位,我們進(jìn)位string ans = ""; // 存儲(chǔ)最后計(jì)算結(jié)果// 將結(jié)果轉(zhuǎn)回為 string ,并返回結(jié)果int temlen = tem.size();for(int i = temlen - 1;~i;--i) ans += char(tem[i] + '0');return ans;
}
代碼詳解如下:
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define int long long
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
inline void solve();signed main()
{
// freopen("a.txt", "r", stdin);
// IOS;int _t = 1;
// cin >> _t;while (_t--){solve();}return 0;
}// 高精度乘以低精度 模板
inline string mul(string A,int x)
{vector<int>a; // 取出每一位int len = A.size(); // 倒著取每一位,方便低位到高位的計(jì)算for(int i = len - 1;~i;--i) a.emplace_back(A[i] - '0');vector<int>tem; // 存儲(chǔ)計(jì)算結(jié)果int t = 0; // 存儲(chǔ)臨時(shí)進(jìn)位數(shù)for(int i = 0;i < len;++i){int num = t + a[i] * x; // 開(kāi)始每一位相乘tem.emplace_back(num % 10); // 取計(jì)算結(jié)果個(gè)位t = num / 10; // 計(jì)算進(jìn)位}if(t) tem.emplace_back(t); // 如果最后有高位的進(jìn)位,我們進(jìn)位string ans = ""; // 存儲(chǔ)最后計(jì)算結(jié)果// 將結(jié)果轉(zhuǎn)回為 string ,并返回結(jié)果int temlen = tem.size();for(int i = temlen - 1;~i;--i) ans += char(tem[i] + '0');return ans;
}// 高精度加法模板
inline string ADD(string A,string B)
{vector<int>a,b;int alen = A.size();int blen = B.size();// 倒著取每一位,方便低位到高位的計(jì)算for(int i = alen - 1;~i;--i) a.emplace_back(A[i] - '0');for(int i = blen - 1;~i;--i) b.emplace_back(B[i] - '0');vector<int>tem; // 存儲(chǔ)計(jì)算結(jié)果int t = 0; // 存儲(chǔ)臨時(shí)進(jìn)位數(shù)for(int i = 0;i < alen or i < blen;++i){int num = t; // 開(kāi)始每一位相加if(i < alen) num += a[i];if(i < blen) num += b[i];tem.emplace_back(num % 10);// 取計(jì)算結(jié)果個(gè)位t = num / 10;// 計(jì)算進(jìn)位}if(t) tem.emplace_back(t); // 如果最后有高位的進(jìn)位,我們進(jìn)位string ans = ""; // 存儲(chǔ)最后計(jì)算結(jié)果// 將結(jié)果轉(zhuǎn)回為 string ,并返回結(jié)果int temlen = tem.size();for(int i = temlen - 1;~i;--i) ans += char(tem[i] + '0');return ans;
}inline void solve()
{int n;string d;bool vis = false; // 檢查是否符合四舍五入cin >> n >> d;// 如果 d 是整數(shù)的情況if(d.find(".") == -1){while(n--){d = mul(d,2);}}else{int pos = d.find("."); // 找到 小數(shù)點(diǎn) . 的位置下標(biāo)int len = d.size() - pos - 1; // 計(jì)算小數(shù)部分長(zhǎng)度d.erase(d.begin() + pos); // 刪掉 小數(shù)點(diǎn) .// 將 d 所有的數(shù)字當(dāng)作整數(shù)相乘計(jì)算while(n--){d = mul(d,2);}pos = d.size() - len; // 更新小數(shù)點(diǎn)位置// 查看小數(shù)點(diǎn)后一位是否符合四舍五入if((d[pos] - '0') >= 5) vis = true;// 刪掉小數(shù)部分,保留整數(shù)while(len--) d.erase(d.begin() + d.size() - 1);if(vis) d = ADD(d,"1"); // 如果符合四舍五入,那么進(jìn)一}cout << d << endl;
}