【发布时间】:2019-01-31 17:04:09
【问题描述】:
每一对 (a,b) 都可以转换为 (a+b, b) 或 (a, a+b)。
给定一个函数 bool isPossible(int a, int b, int c, int d) ,根据是否可以通过 (a,b) 到达 (c,d) 的目标对,实现返回 true 或 false 的逻辑
// (a,b) -> (a, a+b)
// (a,b) -> (a+b,b)
// 2,3 -> 2,5 | 5,3 -> 7,5 | 2, 7 | 5, 8 | 8, 3 -> 12, 5 | 7, 12 | 9, 7 | 2, 9 |5, 13|13,8 | 11, 3 | 8, 11
// a,b -> a,a+b | a+b, b -> a, 2a+b | 2a +b , a+b | a+b, a+2b | a+2b, b -> a, 3a + b | 3a + b , 2a +b |
更新:在此处添加我的解决方案。 寻找其他优雅的解决方案会很有趣。
bool isPossible(int a,int b,int c,int d) {
while(c>=a && d>=b) {
if(a == c && b==d ) {
return true;
}
int temp = c;
c= c>d?c-d:c;
d= d>=temp?d-temp:d;
}
return false;
}
更新:这个解决方案似乎只适用于 a 和 b 的正值。
【问题讨论】:
-
当我们执行 (a+b,b) 时,我们是否将 b 的初始值添加到 b 的更新值?
-
在 (a,b) 变为 (a+b, b) 的情况下,'b' 保持不变,但 'a' 变为 'a+b'。在 (a, a+b) 的情况下发生反之亦然
-
请注意,这个解决方案似乎是绝对错误的;它没有通过我能想到的所有测试:
isPossible(1, 2, 1, 2); isPossible(1, 2, 3, 2); isPossible(1, 2, 3, 5); isPossible(-1, -2, -3, -2);all returnfalse。虽然前三种情况可能很容易解决,但我想后一种情况要困难得多。 -
你是对的。我也应该做负面测试。我已经更新了应该适用于前三种情况的解决方案。稍后会更新最后一个案例。
-
@AlokGarg 您的新解决方案仍然失败 (1,2,1,2) 案例