C/C++語言中的取模(%)取余(/)運算


  相信好多程序員在碼牆的過程中遇到取模(%)和取余(/)的算法,但是就我而言總沒搞清楚這兩者的關系,再次抽個時間baba:

話不多說,先看看這兩者的概念把,百度百科的解釋:

  取模運算(“Modulus Operation”)和取余運算(“Remainder Operation ”)兩個概念有重疊的部分但又不完全一致。主要的區別在
於對負整數進行除法運算時操作不同。取模主要是用於計算機術語中。取余則更多是數學概念。
  模運算在數論和程序設計中都有着廣泛的應用,奇偶數的判別到素數的判別,從模冪運算最大公約數的求法,從孫子問題到凱撒
密碼問題,無不充斥着模運算的身影。雖然很多數論教材上對模運算都有一定的介紹,但多數都是以純理論為主,對於模運算在程序設
計中的應用涉及不多。
 

取余運算區別

  對於整型數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

這個數學概念以及在在不同計算機語言中的用法一定搞清楚(本人就很糊塗)。

 好吧,下面該碼一點代碼了:

#include<stdlio.h>

using namespace std;

 

int main()

{

  char a = 'a', 'b';

  printf("%d\n", a%b);

  return 0;

}

猜猜打印出來時多少(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輸出結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM