看板 C_and_CPP 關於我們 聯絡資訊
題目: 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
firejox:其實只是同餘而已... 07/21 10:53
firejox:a%b = n ,(a*t)%b = (n*t)%b 07/21 11:05
angleevil:謝謝firejox 07/21 11:08
singlovesong:看無@@ 看懂f大的式子可是不知道跟題目的關連>"< 07/21 12:11
firejox:把A<<8 % B 想成A*256 %B ... 07/21 12:53
singlovesong:AAAAA -> (A<<32 + A<<24 + A<<16 + A<<8 + A) % B 07/21 13:16
singlovesong:實際上是算這個式子 為什麼會等價呢@@? 07/21 13:16
singlovesong:sorry 小弟資質愚鈍 07/21 13:16
firejox:(A<<32 + A<<24 + A<<16 + A<<8 + A)%B 相當於 07/21 13:21
firejox:((A<<32)%B + (A<<24)%B +...+ A%B)%B ... 07/21 13:22
firejox:以上述for 則是 (((..(A%B)<<8+A)%B)...)%B 07/21 13:24
firejox:你把它展開就知道了 07/21 13:26
singlovesong:謝謝 :P 07/21 13:50