[問題] ACM 128 software CRC

看板C_and_CPP (C/C++)作者 (~"~)時間14年前 (2011/07/21 10:36), 編輯推噓0(0014)
留言14則, 3人參與, 最新討論串1/1
題目: http://luckycat.kshs.kh.edu.tw/homework/q128.htm 拍謝小弟數學不好 其實是要問數學的@@ 這題是software CRC 就是一串字串當作傳輸資料 關鍵的code 如下 for(int i = 0; i < s.length(); i++) ans = ((ans << 8) + s[i]) % 34943; ans 一開始是 0 s 是input string 例: s = "ABCDEFGHI" 等於是在做一個超大數的除法求餘數 想要問的是為什麼求大數的餘數只要上面那兩行code 就好呢? 自己測試了一下 A % B != (A<<8) %B 以上面的“ABCDEFGHI” 例子來看 資料有九個bytes 也就是2^72 為什麼上面那樣做左邊高位元的資料還能保持它的餘數是正確的呢? 想知道數學原理是什麼 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.184.164.153

07/21 10:53, , 1F
其實只是同餘而已...
07/21 10:53, 1F

07/21 11:05, , 2F
a%b = n ,(a*t)%b = (n*t)%b
07/21 11:05, 2F

07/21 11:08, , 3F
謝謝firejox
07/21 11:08, 3F

07/21 12:11, , 4F
看無@@ 看懂f大的式子可是不知道跟題目的關連>"<
07/21 12:11, 4F

07/21 12:53, , 5F
把A<<8 % B 想成A*256 %B ...
07/21 12:53, 5F

07/21 13:16, , 6F
AAAAA -> (A<<32 + A<<24 + A<<16 + A<<8 + A) % B
07/21 13:16, 6F

07/21 13:16, , 7F
實際上是算這個式子 為什麼會等價呢@@?
07/21 13:16, 7F

07/21 13:16, , 8F
sorry 小弟資質愚鈍
07/21 13:16, 8F

07/21 13:21, , 9F
(A<<32 + A<<24 + A<<16 + A<<8 + A)%B 相當於
07/21 13:21, 9F

07/21 13:22, , 10F
((A<<32)%B + (A<<24)%B +...+ A%B)%B ...
07/21 13:22, 10F

07/21 13:24, , 11F
以上述for 則是 (((..(A%B)<<8+A)%B)...)%B
07/21 13:24, 11F

07/21 13:26, , 12F
你把它展開就知道了
07/21 13:26, 12F


07/21 13:50, , 14F
謝謝 :P
07/21 13:50, 14F
文章代碼(AID): #1E9v2S8U (C_and_CPP)
文章代碼(AID): #1E9v2S8U (C_and_CPP)