跳到内容

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,因为在这种情况下,运算不是从左到右计算的,而是先进行乘法。

华夏公益教科书