ruby - 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 循环来执行此操作。所以,没有其他方法。
解决方案
这是我写它的方式:
(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
是有缺陷的:您永远不会设置c
或a
返回1
- 所以您实际上没有循环遍历(a, b, c)
. (这就是为什么缺少大多数有效答案的原因。)
......最重要的是,你打印错了!问题是找到所有数字ab / bc == a / c
,但你正在打印a / b
- 所以这当然是错误的
故事的寓意:学习如何使用调试器,仔细考虑您编写的逻辑流程,并可能a == 1
在扩展到整个逻辑之前尝试从更简单的基本案例(例如 fix )构建
推荐阅读
- node.js - 负载均衡时socket.io连接不断掉线
- arrays - 如何找到所有 xor 0 的子数组?
- python - 使用 Pytorch 的多任务回归问题(问题:所有测试数据的输出相同)
- python - 从 CI 框通过 Bastion 到 Redshift 的 SSH 隧道
- javascript - 将 Blob WebM 转换为音频文件(WAV 或 MP3)
- c# - 在使用 NUnit 进行单元测试期间从覆盖范围中排除一行代码
- java - 在停止和重新启动我的应用程序时,我收到一个地址已在使用中的 JMX 错误
- java - 约束布局在不同设备上执行不同
- python - Python Requests 库不需要的 GET 请求冒号转义
- reactjs - 与 Expo 相机相关的 Expo 常量包错误,与 SDK 34 相关