取模操作 補充說明

2021-07-30 16:05:34 字數 1535 閱讀 1026

在演算法中,有時候要用到取模操作,為的是避免資料過大溢位,而有時候只需要驗證演算法的有效性,並關心實際的值,下面給出取模操作的性質以及乙個簡單的應用例子。

( a + b ) % c = ( ( a % c ) + ( b % c ) ) % c

( a * b ) % c = ( ( a % c ) * ( b % c ) ) % c

( a – b ) % c = ( ( a % c ) – ( b % c ) ) % c

( a / b ) % c not equal to ( ( a % c ) / ( b % c ) ) % c

(a / b ) % c = ( a * b^ -1 ) % c

the answer ( a % b) always be less than b.

基本上是要記住上面這幾條的,基本夠用。。而b經常取的數為乙個比較大的素數

很顯然,有的時候a + b的值越界(超過integer.max_value),有的時候a * b的值越界(超過integer.max_value)。所以需要相關的模運算性質,在越界之前及時處理。

最頻繁的公式:

1.( a + b ) % c = ( ( a % c ) + ( b % c ) ) % c

2.( a * b ) % c = ( ( a % c ) * ( b % c ) ) % c

int的取值範圍為(-2147483648~2147483647),占用4個位元組(-2的31次方到2的31次方-1)

long的取值範圍為(-9223372036854774808~9223372036854774807),占用8個位元組(-2的63次方到2的63次方-1)

取模運算用的最多的地方是雜湊函式的實現,以及dp用於優化空間的滾動陣列,再就是一些數論演算法,以及避免中間過程的溢位。

public

static

long

factorial1(int n)

return fact;

}public

static

long

factorial2(int n)

return fact;

}public

static

long

factorial3(int n)

return fact % m;

}

這三個階乘程式f1 f2 f3 分別代表不用模操作,正確使用模操作, 錯誤使用模操作。。。

f1和f3的程式會溢位,f3雖然使用模操作,但是是錯誤的示範,模操作應該應用到中間計算過程中。。

這裡f2的m選了乙個很大的素數,這樣可以保證程式在小規模的n能夠輸出正確結果,同時又保證了大規模的n程式不會溢位出錯。

參考:

oled 漢字取模方法說明(備忘)

我這個也是在網上看到的,只不過網上的方法我用了不用,也不懂原理,就把自己實驗得到的結果儲存一下備忘。前提 因為esp8266 01s 記憶體太小,不可能把漢字字型檔放裡面,但為了顯示漢字,只能單字進行取模。軟體 pctolcd2002 設定 我用的是esp 01s和1.3寸oled做的乙個時鐘,其他...

反彙編取模操作小記

今天遇到了取模的問題,記錄一下。參考c 反彙編與逆向這本書,如下 在vc 6.0中,對兩個變數取模或者對非2的冪取模,可直接使用div或idiv指令完成,餘數在dx或者是edx中。對2的k次方取餘,餘數的值只需取得被除數二進位制數值中的最後k位的值即可,負數則還需在k位之前補1,設k為5,可以得到以...

取模與取餘

通常情況下取模運算 mod 和求餘 rem 運算被混為一談,因為在大多數的程式語言裡,都用 符號表示取模或者求餘運算。在這裡要提醒大家要十分注意當前環境下 運算子的具體意義,因為在有負數存在的情況下,兩者的結果是不一樣的。對於整型數a,b來說,取模運算或者求餘運算的方法都是 1.求 整數商 c a ...