Test Message

b982: YoJudge 預練(空間之章)

內容

前幾天看到一隻 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;
}