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