首页 > 解决方案 > Ruby 中的不同简化操作

问题描述

我试图在 Ruby 中编写一个关于不同简化运算符的程序。(ab / bc) = a / c当 a、b、c 是数字并且 bc > ab 时,我必须找到数字。例如:16 / 64 = 1 / 4

这是我的代码:

a = 1
b = 1
c = 1 
num1 = 10*a + b
num2 = 10*b + c

while b < 9 && c < 9
  b += 1
  num1 += 1
  num2 = num2 + 10 
  while num2 > num1
    c +=1 
    num2 += 1
    while a < 9 
      a += 1
      num1 = num1 + 10
      if (num1 / num2) == (a / c)
        puts "#{a} / #{b}"
      end
   end
end
end

我应该达到 16/64、19/95、26/65 和 49/98,但 Ruby 给了我 2/2、3/2、5/2、7/2 和 9/2。我的代码有什么问题?我只允许使用 while 循环来执行此操作。所以,没有其他方法。

标签: rubyloopswhile-loop

解决方案


这是我写它的方式:

(1..9).each do |a|
  (1..9).each do |b|
    (1..9).each do |c|
      ab = 10*a + b
      bc = 10*b + c
      next if bc <= ab || (ab.to_f / bc) != (a.to_f / c)

      puts "#{ab} / #{bc} == #{a} / #{c}"
    end
  end
end

# Result:
# 16 / 64 == 1 / 4
# 19 / 95 == 1 / 5
# 26 / 65 == 2 / 5
# 49 / 98 == 4 / 8

请注意我对to_f- 的使用,这很重要,因为如果你只是尝试除整数,你会得到一个整数答案(例如3/2 == 1,但是3.to_f/2 == 1.5)。


你的解决方案有什么问题?除了前面提到的整数除法问题(这就是你的结果显然不正确的原因)之外,还有一些问题。

一方面,您会立即在循环中增加a,b和的值c,因此您永远不会实际测试它们等于 1 的情况。(这就是为什么所有结果都以 . 开头的原因b == 2。)

此外,这个内部循环是错误的:

while a < 9 
  a += 1
  # ...

...因为通过更改 的值a,您也可能使 的假设无效num2 > num1。(这就是您的结果包含不正确分数的原因。)

接下来,您使用循环的总体策略while是有缺陷的:您永远不会设置ca返回1- 所以您实际上没有循环遍历(a, b, c). (这就是为什么缺少大多数有效答案的原因。)

......最重要的是,你打印错了!问题是找到所有数字ab / bc == a / c,但你正在打印a / b- 所以这当然是错误的


故事的寓意:学习如何使用调试器,仔细考虑您编写的逻辑流程,并可能a == 1在扩展到整个逻辑之前尝试从更简单的基本案例(例如 fix )构建


推荐阅读