相信好多程序員在碼牆的過程中遇到取模(%)和取余(/)的算法,但是就我而言總沒搞清楚這兩者的關系,再次抽個時間baba:
話不多說,先看看這兩者的概念把,百度百科的解釋:
取余運算區別
對於整型數a,b來說,取模運算或者求余運算的方法都是:
1. 求 整數商: c = a/b;
2. 計算模或者余數: r = a - c*b.
求模運算和求余運算在第一步不同: 取余運算在取c的值時,向0 方向舍入(fix()函數);而取模運算在計算c的值時,向負無窮方向舍入(floor()函數)。
例如計算:-7 Mod 4
那么:a = -7;b = 4;
第一步:求整數商c,如進行求模運算c = -2(向負無窮方向舍入),求余c = -1(向0方向舍入);
第二步:計算模和余數的公式相同,但因c的值不同,求模時r = 1,求余時r = -3。
歸納:當a和b符號一致時,求模運算和求余運算所得的c的值一致,因此結果一致。
當符號不一致時,結果不一樣。求模運算結果的符號和b一致,求余運算結果的符號和a一致。
另外各個環境下%運算符的含義不同,比如c/c++,java 為取余,而python則為取模。
補充:
7 mod 4 = 3(商 = 1 或 2,1<2,取商=1)
-7 mod 4 = 1(商 = -1 或 -2,-2<-1,取商=-2)
7 mod -4 = -1(商 = -1或-2,-2<-1,取商=-2)
-7 mod -4 = -3(商 = 1或2,1<2,取商=1)
這里模是4,取模其實全稱應該是取模數的余數,或取模余。
增加補充內容(以上五行)后,被修改商值,但是括號內容不變,出現奇怪矛盾。
在python下 % 運算符代表取模,如要修改,請先用python做-7 % 4運算,或其它語言做取模運算驗證,理解后再動手。
其余請大家移步:
https://baike.baidu.com/item/%E5%8F%96%E6%A8%A1%E8%BF%90%E7%AE%97/10739384
這個數學概念以及在在不同計算機語言中的用法一定搞清楚(本人就很糊塗)。
好吧,下面該碼一點代碼了:
猜猜打印出來時多少(a 的ASCII為97 b的ASCII為98)?
你猜對了嗎:值為97,我的娘,為啥?細細讀完百度百科的朋友一定知道:
兩個正整數a和b,其a對b求%(模), 則 r = a - (a/b)*b; 注:r為a對b求的%(模,其實在C++中其實就是取余)。
所以,對上面代碼的解讀:
c = a/b = 97/98 = 0;(c 為a對b求的商值)。
r = a - (a/b)*b = 97 - (97/98)*98 = 97-0 = 97。
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
char ca = 'a', cb = 'b';
printf("%d\n", ca % cb);
int a = -7,b = 4;
int c = -7 / 4;
int d = -7 % 4;
int r = -7 - c * 4;
printf("%d\n", c);
printf("%d\n", d);
printf("%d\n", r);
system("pause");
return 0;
}
VS2015輸出結果: