柚子快報激活碼778899分享:r語言 R 格式(藍橋杯)
文章目錄
R 格式【問題描述】解題思路高精度乘法+高精度加法
R 格式
【問題描述】
小藍最近在研究一種浮點數(shù)的表示方法:R 格式。對于一個大于 0 的浮點數(shù) d,可以用 R 格式的整數(shù)來表示。給定一個轉(zhuǎn)換參數(shù) n,將浮點數(shù)轉(zhuǎn)換為 R格式整數(shù)的做法是:
將浮點數(shù)乘以 2n;四舍五入到最接近的整數(shù)。
【輸入格式】 一行輸入一個整數(shù) n 和一個浮點數(shù) d,分別表示轉(zhuǎn)換參數(shù),和待轉(zhuǎn)換的浮點數(shù)。 【輸出格式】 輸出一行表示答案:d 用 R 格式表示出來的值。 【樣例輸入】
2 3.14
【樣例輸出】
13
【樣例說明】 3.14 × 22 = 12.56,四舍五入后為 13。
【評測用例規(guī)模與約定】 對于 50% 的評測用例:1 ≤ n ≤ 10,1 ≤ 將 d 視為字符串時的長度 ≤ 15。 對于 100% 的評測用例:1 ≤ n ≤ 1000,1 ≤ 將 d 視為字符串時的長度≤ 1024;保證 d 是小數(shù),即包含小數(shù)點。
解題思路
題意分析:
將浮點數(shù)乘以 2n;四舍五入到最接近的整數(shù)。
根據(jù)題意將d * 2n分解為d * 2 * 2 * 2 * 2 * 2……(這里2的n次方不能使用pow函數(shù),當(dāng)n過大,會得不到答案),因為d長度小于等于1024,所以可以使用高精度乘法的算法來實現(xiàn)
然后該如何去乘?這里我先給出結(jié)論: 一個小數(shù)乘以一個大于0的整數(shù)時,小數(shù)點位數(shù)本身不會改變,但小數(shù)點后面的數(shù)字可能會發(fā)生變化。乘法操作并不改變數(shù)字中小數(shù)點的位置,它只是會影響小數(shù)點前后的數(shù)字值。 所以,我們先將小數(shù)看作一個整數(shù)相乘即可,例如:1.05 * 2=105 * 2=210=2.10
四舍五入:最后看小數(shù)點第一位是否大于等于5,如果大于等于5,前一位需要+1,需要注意的是這里可能存在連續(xù)進位,例如9999.5應(yīng)該四舍五入為10000,所以這里因該使用高精度加法的算法
高精度乘法+高精度加法
#include
using namespace std;
// 乘法函數(shù),用于將向量 a 中的每個元素乘以整數(shù) n,并返回結(jié)果向量
vector
{
vector
int t=0; // 用于累計進位
for(int i=0;i { if(i c.push_back(t%10); // 將乘積的個位數(shù)加入結(jié)果向量 t/=10; // 更新進位 } return c; // 返回結(jié)果向量 } // 加法函數(shù),用于將向量 b 的每個元素與整數(shù) n 相加,并返回結(jié)果向量 vector { vector int t=0; // 用于累計進位 for(int i=0;i { t+=b[i]; // 加上當(dāng)前位的值 if(n) t+=n%10; // 如果 n 不為零,則加上 n 的當(dāng)前位 c.push_back(t%10); // 將和的個位數(shù)加入結(jié)果向量 t/=10; // 更新進位 n/=10; // 更新 n,移動到下一位 } if(t) c.push_back(t); // 如果最后還有進位,加到結(jié)果向量的末尾 return c; // 返回結(jié)果向量 } int main() { int n; // 轉(zhuǎn)換參數(shù) n string s; // 待轉(zhuǎn)換的浮點數(shù) d 作為字符串 cin>>n>>s; // 從輸入讀取 n 和 s string t; // 用于存儲去掉小數(shù)點后的數(shù)字字符串 int k=0; // 小數(shù)點后數(shù)字的個數(shù) // 移除小數(shù)點,并計算 k for(int i=0;i { if(s[i]!='.') t+=s[i]; else k=i; } k=t.size()-k; // 計算小數(shù)點后的位數(shù) vector // 將字符串 t 的數(shù)字轉(zhuǎn)換為向量 a for(int i=t.size()-1;i>=0;i--) a.push_back(t[i]-'0'); // 將 a 乘以 2^n for(int i=1;i<=n;i++) a=mul(a,2); reverse(a.begin(),a.end()); // 反轉(zhuǎn)結(jié)果向量,以便從最高位開始處理 int p=a[a.size()-k]; // 獲取可能需要四舍五入的位 if(p>=5) // 如果需要四舍五入 { vector // 構(gòu)造需要增加 1 的向量 b for(int i=a.size()-1-k;i>=0;i--) { b.push_back(a[i]); } b=sum(b,1); // 對 b 加 1 for(int i=b.size()-1;i>=0;i--) cout< } else // 如果不需要四舍五入 {
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。