Python 和 Ruby 中的數學/Ruby 中的整數

整數的一個特點是,任何一個整數都擁有一個前驅和一個後繼。雖然計算它們非常容易(從一個整數中減去或加上一),但Ruby 有名為pred 和 succ 的方法來處理它們!
此指令碼
a=7
puts(a)
產生了與以下結果完全相同的結果
a="7"
puts(a)
至少從表面上看。但是,如果嘗試新增 2,
a=7
puts(a+2)
如預期的那樣產生 9,但是
a="7"
puts(a+2)
產生錯誤訊息,因為不能將數字與字串相加。
所以,表示整數的字串必須使用to_i 方法(轉換為整數)轉換為數字。因此
a="7"
b=a.to_i
puts(b+2)
這次產生 9。
另一種從字串中獲取整數的方法是計算其字母數。這可以透過其length 屬性實現
t="Supercalifragilisticexpialidocious"
n=t.length
puts(n)
實數也有一個to_i 方法,可以將其轉換為整數。這有時很有用,因為對於Ruby 不被視為整數
a=Math.sqrt(100)
puts(a.integer?)
Ruby 回答false 因為該數字被計算為10.0,而不是10。所以
a=Math.sqrt(100).to_i
puts(a.integer?)
產生預期的true。但是
a=3.9999999
b=a.to_i
puts(b)
可能不會產生預期的結果:to_i 使用截斷 而不是近似。實際上,floor 具有相同的效果
a=3.9999999
b=a.floor
puts(b)
相反,實數也有一個ceil 方法
a=3.9999999
b=a.ceil
puts(b)
但現在出現了另一個問題
a=3.0000001
b=a.ceil
puts(b)
也許 4 不是預期的答案!
最後,獲取整數近似的最佳方法是round
a=3.9999999
b=a.round
puts(b)
所以,要獲取一個整數的後繼,要求它告訴它的後繼,使用它的方法succ
puts(7.succ)
表明 7+1=8(你賭對了!),而
puts(7.pred)
表明 7-1=6。但是與皮亞諾公理 數 7 相反,零有前驅(即 -1),因為對於Ruby,整數是有理整數,而不僅僅是自然數。那麼,任何整數都有一個加法逆元,可以透過在它的名稱前加一個減號來獲得
a=-5
puts(-a)
這產生了 5,因為 -5 的加法逆元是 5。
要知道一個整數是否為素數,需要另一個名為mathn 的模組,它提供一個素數測試prime?(一個布林值)
require 'mathn'
a=2**32+1
puts(a.prime?)
這直觀地表明 4 294 967 297 不是素數,真是可恥費馬(他有藉口,他沒有Ruby 控制檯!)!
對於Ruby,算術運算由+、- 和* 表示,這並不奇怪。這些運算也適用於負整數
a=5
b=-8
puts(a+b)
puts(a-b)
puts(a*b)
除非另有說明,否則由斜槓運算子表示的除法是整數除法。要另行說明,需要將其中一個運算元寫成float,用一個點
num=3
den=2
q=num/den
puts(q)
產生 1 而不是 1.5,因為整數商為 1(有餘數),而以下任何變體都產生 1.5
puts(3.0/2)
puts(3/2.0)
puts(3.0/2.0)
puts(3.to_f/2)
要計算非整數商的精確值,需要使用分數。
有時(經常?)商不如餘數重要(例如 RSA 加密,甚至小時,以 12 為模計數)。餘數由模運算子給出,表示為%
a=13
b=8
r=a%b
puts(r)
然後,使用Ruby 在模運算 中進行計算是完全可能的。
a=13572468
b=12345678
g=a.gcd(b)
puts(g)
當然,a.gcd(b) 和 b.gcd(a) 產生相同的結果。
類似地,兩個整數a 和b 的lcm 可以計算為a.lcm(b)。
沒有除數(除 1 和自身以外)的整數稱為素數。Ruby 可以測試(不太大)整數的素數性
require 'prime'
n=2012
puts(n.prime?)
puts(n.prime_division)
上面的例子表明,Ruby 甚至可以找到一個整數的素數除數!
在 Ruby 中,指數運算 運算子用與乘法相同的 星號 表示,但寫兩次
a=4
b=2
puts(a**b)
puts(b**a)
這表明 .
備註
- 如果指數為負數,則指數運算的結果為分數。
- 如果指數為 浮點數,則結果為浮點數,即使它實際上是一個整數(如 256**0.25)。
在 Ruby 中,與代數一樣,計算的順序如下
- 首先是括號;
- 然後是函式(例如指數運算);
" 然後才是乘法和除法;
- 最後是加法和減法。
因此
puts(2+3*5)
顯示的是 17 而不是 25,因為在這種情況下,運算不是從左到右計算的,而是先進行乘法。