algorithm - 使用给定规则将 x,y 从 1,1 更改为 p,q
问题描述
给定 a = p, b = q 在一个循环中,a 可以变为 a = a + b 或 b = b + a 在任何循环中,两者中的任何一个都可以执行,但不能同时执行。
从 a = 1 开始,b = 1
使用上述规则计算将 (x, y) 从 (1, 1) 转换为 (p,q) 所需的迭代次数。
如果无法完成,则无法退货
谁能告诉如何解决这个问题。
解决方案
正如评论中已经提到的,您可以倒退。较大的元素必须是执行计算的元素。所以你可以对较大的元素做相反的事情,看看你是否最终得到 (1, 1)。或者更好地直接从较大的元素中减去较小的元素,使其变得比另一个小:
function steps(a, b) {
let count = 0
while (a != b) {
console.log('(' + a + ', ' + b + ')')
let t
if (a > b) {
t = a % b == 0 ? a / b - 1 : Math.floor(a / b)
a -= t * b
} else {
t = b % a == 0 ? b / a - 1 : Math.floor(b / a)
b -= t * a
}
count += t
}
if (a == 1)
return count
return -1
}
console.log(steps(87, 13))
console.log(steps(23, 69))
推荐阅读
- php - PHP试图通过关键字设置类别没有错误和空标签
- sql - 按新行分隔值并拆分到新行
- excel - Excel 和 PowerBI 中的 ALLSELECTED 差异
- python - IPython / Spyder 不显示变量赋值的输出
- flutter - Flutter:如何在下拉列表中设置默认值,但出现一些错误
- javascript - 从 Flask+Ajax 动态更新 HTML 图像
- java - 在Android中获取位置后创建一个返回地址的类
- php - 表单不保存提交的查询
- swagger - Swagger yaml 和注解组合
- javascript - 为什么在没有 -1 的 JS 中我在控制台的第二个 for 循环中未定义