Problem
題目網址
中文網址
每一個 ASCII 字元就代表了一位數(8-bit),而 CRC 值則是加在 LSB 後的 16-bit,使得此數可被 G 整除。
注意輸入如為空(只有End of line),輸出應為 00 00
。
Solution
先做大數 mod,邊乘邊 mod。
接著為了要計算 CRC 值,需要先將數字向左移 16 位,分兩次來做,防止溢位。
(((now << 8) % G) << 8) % G
可得到餘數,再用 G 減掉它即可得到要加上去的 16-bit 了。
輸出格式需分成兩個部分,now >> 8
移完剩下的就是前 8 位了。 now % 256
則是後 8 位。
Code
UVa 1281 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include<cstdio> #define G 34943
int main() { char num[1025];
while (gets(num) && num[0] != '#') { if (!num[0]) puts("00 00"); else { int now = 0; for (int i = 0; num[i]; i++) now = ((now << 8) + num[i]) % G; now = G - (((now << 8) % G) << 8) % G; printf("%02X %02X\n", now >> 8, now & 255); } }
return 0; }
|