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