跳到內容

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

來自 Wikibooks,開放世界的開放書籍

整數的一個特點是,任何一個整數都擁有一個前驅和一個後繼。雖然計算它們非常容易(從一個整數中減去或加上一),但Ruby 有名為predsucc 的方法來處理它們!

如何在 Ruby 中獲取整數

[編輯 | 編輯原始碼]

從字串

[編輯 | 編輯原始碼]

此指令碼

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模運算 中進行計算是完全可能的。

Ruby 中,gcd 是一個中綴 運算

a=13572468
b=12345678
g=a.gcd(b)
puts(g)

當然,a.gcd(b)b.gcd(a) 產生相同的結果。

類似地,兩個整數ablcm 可以計算為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)

這表明 .

備註

  1. 如果指數為負數,則指數運算的結果為分數。
  2. 如果指數為 浮點數,則結果為浮點數,即使它實際上是一個整數(如 256**0.25)。

優先順序

[編輯 | 編輯原始碼]

Ruby 中,與代數一樣,計算的順序如下

  1. 首先是括號;
  2. 然後是函式(例如指數運算);

" 然後才是乘法和除法;

  1. 最後是加法和減法。

因此

puts(2+3*5)

顯示的是 17 而不是 25,因為在這種情況下,運算不是從左到右計算的,而是先進行乘法。

華夏公益教科書