題意:操作系統讀取空間的規則 與 生產廠家讀取的規則 有所不同,操作系統在存儲單位之間的換算是 1KB = 1024B (以此類推),生產廠家的換算規則是 1KB = 1000B,這樣就會導致生產出來後操作系統讀取的空間與廠家標註的有誤差,現在給出一個存儲量,要求這兩者之間的誤差。
計算誤差的方法: 首先將給出的單位換算成B 然後:
()%
思路:首先這題非常簡單。首先把單位化小就是把數字按比例擴大,生產廠家的縮小一個單位就乘以1000,操作系統的縮小一個單位就乘以1024,之後把結果代入上面的公式就可以了,如果 long long 再多幾個0這個題目就解出來了,but沒有。其實再想一下那個分式,除出來的結果就是一個小於1的值,而且 上面✖️幾個 1000,下面就要➗幾個1024,那爲什麼不把這兩個數捆綁起來當作一個常數,縮小一次單位就乘以一次(1000/1024)這樣就OK了。 剩下就是讀取單位了,方法很多種,我用的比較直觀的map。
#include <iostream>
#include <cmath>
#include <map>
#include <cstring>
using namespace std;
const double h = 1000.0/1024.0;
map<string, int> mp;
int _;
string s;
void init() {
mp["B]"] = 0; mp["KB"] = 1; mp["MB"] = 2;
mp["GB"] = 3; mp["TB"] = 4; mp["PB"] = 5;
mp["EB"] = 6; mp["ZB"] = 7; mp["YB"] = 8;
}
int main() {
init();
scanf("%d", &_);
for(int p = 1;p <= _; p++) {
cin >> s;
string dw = "";
int pos;
for(int i = 0;i < s.length(); i++) {
if(s[i] == '[') {
pos = i+1;
break;
}
}
dw += s[pos]; dw += s[pos+1];
printf("Case #%d: %.2lf", p, (1-pow(h,mp[dw]))*100);
puts("%");
}
}