內容
前幾天看到一隻 b961 YoJudge 怪獸,感覺太強大了,所以先打 Lo 練功,期盼來日再戰 YoJudge 怪獸。
這次任務較簡單,將以下各種格式的空間單位統一轉換為位元(bit)。 以下 x,y,z,u,v,a 皆為非負整數
可能出現的時間單位格式如下:
xgb :代表 x*10^9*8 bits, 0<=x<1000
ymb :代表 y*10^6*8 bits, 0<=y<1000
zkb :代表 z*10^3*8 bits, 0<=z<1000
ubyte :代表 u*8 bits, 0<=u<1000
z.akb :代表 z kb 又 a*100 byte, 0<=z<1000, 0<=a<10
u.vbyte :代表 u byte 又 v bits, 0<=u<1000, 0<=v<8
vbit :代表 v 位元(bit), 0<=v<8
xgym :代表 x gb 又 y mb , 0<= x,y <1000
xgymzk :代表 x gb 又 y mb 又 z kb , 0<= x,y,z <1000
ymzk :代表 y mb 又 z kb , 0<= y,z <1000
輸入
多行直到 EOF,每行只有如上題目所說的空間格式,沒有空格
987gb
654mb
123kb
56byte
34.7kb
543.2byte
7bit
87g65m
567g34m210k
90m800k
輸出
將輸入的每一行換算為位元(bit),輸出一行整數
7896000000000
5232000000
984000
448
277600
4346
7
696520000000
4536273680000
726400000
解題思路
b981 的類題只是這題數字更大了要用 long long 存。
因為數字太大所以用位元運算加速,其實直接用乘的也能過。
完整程式碼
AC (2ms, 124KB)
#include <stdio.h>
inline long long Gbit(long long src) { return (src << 33) - (src << 29) - (src << 25) - (src << 24) - (src << 21) - (src << 19) - (src << 16) - (src << 15) - (src << 13) - (src << 12); }
inline long long Mbit(long long src) { return (src << 23) - (src << 18) - (src << 17) + (src << 12) + (src << 9); }
inline int Kbit(int src) { return (src << 13) - (src << 7) - (src << 6); }
inline int Bit(int src) { return src << 3; }
int main() { long long bits; int tmp; char str[1000]; while (scanf(" %s", &str) == 1) { int tmp = bits = 0; for (int i = 0; str[i] != 0; i++) { if (str[i] >= '0' && str[i] <= '9') { tmp = (tmp << 3) + (tmp << 1) + (str[i] - '0'); } else { switch (str[i]) { case 'g': bits += Gbit(tmp), tmp = 0; break; case 'm': bits += Mbit(tmp), tmp = 0; break; case 'k': bits += Kbit(tmp), tmp = 0; break; case 'y': bits += Bit(tmp), tmp = 0; case 'i': bits += tmp, tmp = 0; break; case '.': if (str[i + 2] == 'k') bits += Kbit(tmp) + Bit((str[i + 1] - '0') * 100); else bits += Bit(tmp) + (str[i + 1] - '0'); i += 3, tmp = 0; break; default: break; } } } printf("%lld\n", bits); } return 0; }
|