Hard Disk Drive HDU - 4788

題目鏈接

題意:操作系統讀取空間的規則 與 生產廠家讀取的規則 有所不同,操作系統在存儲單位之間的換算是 1KB = 1024B (以此類推),生產廠家的換算規則是 1KB = 1000B,這樣就會導致生產出來後操作系統讀取的空間與廠家標註的有誤差,現在給出一個存儲量,要求這兩者之間的誤差。

計算誤差的方法: 首先將給出的單位換算成B 然後:

11-\frac{生 產 廠 家 給 的 量}{操 作 系 統 讀 出 的 量})%

思路:首先這題非常簡單。首先把單位化小就是把數字按比例擴大,生產廠家的縮小一個單位就乘以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("%");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章