Project1

标题: 能否新建一个数据类型? [打印本页]

作者: 冷峻逸    时间: 2015-9-12 14:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: 喵呜喵5    时间: 2015-9-12 15:43
本帖最后由 喵呜喵5 于 2015-9-12 15:48 编辑

RUBY 代码复制
  1. class Fraction
  2.   attr_accessor :numerator, :denominator  
  3.   def initialize(array)
  4.     @numerator = array[0].to_i   
  5.     @denominator = array[1].to_i
  6.     raise "分母不为0" if @denominator == 0
  7.     reduction
  8.   end
  9.   # 极其简陋的约分(破坏性)
  10.   def reduction
  11.     @denominator = 1 if @numerator == 0
  12.     [@denominator, @numerator, 2, 3, 5, 7].each do |i|
  13.       next if i == 1 || i == -1 || i == 0
  14.       while @numerator % i == 0 && @denominator % i == 0        
  15.         @denominator /= i; @numerator /= i
  16.       end
  17.     end
  18.     self
  19.   end
  20.   # 取负数(破坏性)
  21.   def -@; self.numerator = -self.numerator; self; end
  22.   # 取倒数(破坏性)
  23.   def reciprocal
  24.     self.numerator ,self.denominator = self.denominator, self.numerator
  25.     self
  26.   end  
  27.   # 将整数转换为分数
  28.   def change_to_fraction(number)
  29.     return Fraction.new([number,1]) if number.class != Fraction
  30.     number
  31.   end
  32.   # 加
  33.   def +(number)
  34.     r = self.clone
  35.     n = change_to_fraction(number)
  36.     r.numerator *= n.denominator
  37.     r.numerator += n.numerator * r.denominator
  38.     r.denominator *= n.denominator   
  39.     r.reduction   
  40.   end
  41.   # 乘
  42.   def *(number)
  43.     n = change_to_fraction(number)
  44.     r = self.clone
  45.     r.denominator *= n.denominator
  46.     r.numerator *= n.numerator
  47.     r.reduction
  48.   end
  49.   # 减
  50.   def -(number); self.+(-number); end
  51.   # 除
  52.   def /(number); self.*(change_to_fraction(number).reciprocal); end
  53.  
  54.   # 数据类型的转换
  55.   def to_f; @numerator.to_f / @denominator; end
  56.   def to_i; @numerator / @denominator; end
  57.   def to_s
  58.     return @numerator.to_s if @denominator == 1
  59.     "#{@numerator}/#{@denominator}"
  60.   end
  61. end
  62.  
  63.  
  64. a = Fraction.new([1,4])
  65. b = Fraction.new([2,3])
  66.  
  67. p a + b
  68. p a - 1
  69. p b * 3
  70. p b / a

作者: 574656549    时间: 2020-6-6 21:56
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1