1. 程式人生 > >詳解負數取模運算

詳解負數取模運算

有人如果在python上使用%運算,肯定會遇到這樣的問題,就是它在負數上的結果和我們之前在C或JAVA上的結果不一樣。比如: -6 % 5這個運算,在python中的結果是4,但是在C/JAVA上的結果是-1

這是為什麼呢?wiki百科的解釋很好,英文好的可以去看看,這裡做一個簡單的搬運:

取模運算

所謂取模運算在數學上就是通過輾轉相除法得到的餘數,一般滿足下面這個式子:

{\displaystyle {\begin{aligned}q\,&\in \mathbb {Z} \\a\,&=nq+r\\|r|\,&<|n|\end{aligned}}}

所以,r = a - nq,而q的計算曆史上出了2個分支:

truncate

這派的思想很簡單,就是截去小數部分。

r=a-n\operatorname {trunc} \left({\frac {a}{n}}\right)

比如3/2 = 1 , -3/2 = -1

簡單,粗暴。

floor

floor是Donald Knuth

大神提出來的,它的意思是像下取整。這個就有意思了,因為在正數的時候和truncate一樣,但是在負數的時候,向下取整就會出現和truncate不一樣的結果。

r=a-n\left\lfloor {\frac {a}{n}}\right\rfloor

比如:3/2 = 1 -3/2 = -2

其他

當然還有其他的一些人提出的一些別的方案,但是都大同小異,有些要確保r為正,有些在正數和負數的時候做不同的操作……

運用

C

C還有JAVA使用的truncate的方法,所以在計算-6 % 5 的時候是這麼算的:

-6 - (5*trunc(-6/5))= -6 - (5 * -1) = -1

python

python使用的floor除法的方式

-6 - (5*floor
(-6/5))
= -6 - (5 * -2) = 4

結論

反正,在取模運算上,基本不同的語言都有自己的一套機制,一般來說,這套機制在正數上都一樣,所以為了避免出現不必要的問題,建議先把負數轉成正數再做取模運算。

相關推薦

負數運算

有人如果在python上使用%運算,肯定會遇到這樣的問題,就是它在負數上的結果和我們之前在C或JAVA上的結果不一樣。比如: -6 % 5這個運算,在python中的結果是4,但是在C/JAVA上的結果是-1 這是為什麼呢?wiki百科的解釋很好,英文好的可以

The mod(%) operation 負數運算

Please indicate the source if you want to reprint: http://blog.csdn.net/gaoxiangnumber1 If a and d a

負數運算

最近在學習運算子時,遇到了負數取模(求餘數)的問題。對於正數取模很簡單,但複數取模時,不同的計算器卻有不同的答案。在網上看了一篇文件感覺總結的很詳盡和大家共享 源地址:https://ceeji.net/blog/mod-in-real/ 背景 最近在一道 Java 習題中

java中對負數運算

例: System.out.println(-2%5);//-2 System.out.println(2%-5);//2 System.out.println(-2%-5);//-2 Syst

負數運算問題

今天做一個筆試題,遇到了負數取模運算,做一個總結。 我們平常遇到的除法取餘,很少涉及負數。 那麼對於負數取餘,一共只有三種情況。 12%(-5)=2  因為商是-2,所以餘數是 2 (-12)%(-5)=-2 因為商是2,所以餘數是 -2 (-12)%5 = -2 因為商

Java%(運算)

一.Java的取模運算 1.實現演算法 public static double ramainder(double dividend, double dividor) { return dividend - dividend / divi

分數的乘法逆元和負數運算

好的 分數 多少 研究 法則 表達 求余 推導 模運算 1.乘法逆元 A.定義 如果ax≡1 (mod p),且gcd(a,p)=1(a與p互質),則稱a關於模p的乘法逆元為x。 既然有ax≡1 (mod p),那麽有ax - py = 1,x是a關於模p的乘法逆元

計算機系統 二進位制原碼 補碼 反碼 JAVA 二進位制位運算(位與 位或 位反 位異或 左移 右移)

       在計算機系統中,數值一律使用補碼來表示和儲存。在探求為何計算機要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念。   對於一個數, 計算機要使用一定的編碼方式進行儲存。 原碼, 反碼, 補碼是計算機儲存一個具體數字的編碼方式。   一個數在計算機中的二

負數運算

我們知道,在不同的語言中,對負數執行取模運算,結果有可能會是不同的。例如,(-11)%5在python中計算的結果是4,而在C(C99)中計算的結果則是-1。 truncate除法 && floor除法  在大多數程式語言中,如果整數a不是整數b的整數倍

運算

add 結合 重要 nbsp left 但是 list padding 四則運算 腦子不好使,老是記不住(?_?),備忘一下。 模運算與基本四則運算有些相似,但是除法例外。其規則如下: (a + b) % p = (a % p + b % p) % p (a -

npm的塊安裝機制

追加 all 這樣的 2.0 https alt png wid 解釋 詳解npm的模塊安裝機制 依賴樹表面的邏輯結構與依賴樹真實的物理結構 依賴樹表面的邏輯結構與依賴樹真實的物理結構並不一定相同! 這裏要先提到兩個命令:tree -d(linux)和npm ls(npm)

Fidder-抓HTTPS清求(Web/App)抓包分析(靠譜篇)

可能 clas 請求 設置代理 cer port 關閉 lan str 為什麽要學Fidder抓包? 學習接口,必須要學http協議,不要求您對協議的掌握有多深。只是希望你能夠了解什麽是協議、協議的報文、狀態碼等等!本文通過抓包工具Fidder帶你進入接口的大門。我們通過

Python 正則表達式與 re 塊的使用

1.3 個數 介紹 date 點號 name 檢查 模塊 大小寫 強烈推薦正則表達式在線測試網站: https://regex101.com/ 1. 標準庫模塊 re 更多詳情參考官方文檔: https://docs.python.org/3/howto/rege

Hibernate(四) - HQL_QBC查詢--抓策略優化機制

load i++ lec for 簡單的 測試類 domain 字符 main.c Hibernate 的查詢方式   在 Hibernate 中提供了很多種的查詢的方式。Hibernate 共提供了五種查詢方式。 1、Hibernate 的查詢方式:OID 查詢   OI

Hdu 1395 2^x mod n = 1 運算

Problem Description Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1.     Input One positive integer on ea

運算運算

對於整型數a,b來說,取模運算或者求餘運算的方法都是: 1.求整數商: c = a/b; 2.計算模或者餘數: r = a - c*b.   求模運算和求餘運算在第一步不同: 取餘運算在取c的值時,向0方向舍入(fix()函式);而取模運算在計算c的值時,向-∞方向舍入(f

【Hibernate(四)】HQL_QBC查詢——抓策略優化機制

1.2 Hibernate的查詢的方式 Hibernate共提供了五種查詢方式。 1.2.1 Hibernate的查詢方式:OID查詢 OID檢索:Hibernate根據物件的OID(主鍵)進行檢索 1.2.1.1 使用get方法 Customer customer

給定A, B兩個整數,不使用除法和運算,求A/B的商和餘數

第一種辦法: 從小到大遍歷 for(i = 2 to A - 1) if(i * B > A) 商 = i- 1, 餘 = A - (i -1) * B 第二種辦法 二分法,在[2, A]中查詢滿足的解 第三種辦法 以除數為初始測試值,以2的指數

關於運算(mod)和求餘(rem)運算

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

java 中負數

正數取模運算相信很多人都很熟練,但是有時候會涉及到負數的取模,比如說面試。今天就來看看負數參與的取模應該怎麼整。 2%(-5)結果應該是什麼呢?  5%(-2)結果又應該是什麼呢?  結論一:正數取模負數的結果和正數取模這個負數的絕對值的結果完全一樣。