代码无限输出94601019043208后报SIGKILL错误,求技术解决
解决代码无限输出数值并触发SIGKILL的问题
首先,咱们来拆解你遇到的问题:你的代码会无限输出94601019043208然后被系统发送SIGKILL终止,核心原因是死循环,而且你的代码逻辑本身也存在对问题理解的偏差。
问题根源分析
死循环的触发条件
你的for循环从res(也就是x和y的最大值)开始遍历到r,寻找满足(x&i)*(y&i) == x*y的i。但如果这个区间内不存在这样的i,i会一直递增,直到超出long long的最大值,发生溢出变成负数。因为负数一定小于正数r,循环条件i<=r会永远成立,导致程序陷入死循环,CPU占用拉满,最终被系统强制终止(SIGKILL)。逻辑偏差:满足条件的i的本质
要让(x&i)*(y&i) == x*y,必须同时满足x&i == x和y&i == y——也就是说,i的二进制位必须完全包含x和y的所有置位(1的位)。满足这个要求的最小i是x | y(按位或),而不是max(x,y)。比如x=2(10)、y=4(100),max(x,y)=4,但4&2=0,乘积为0,远小于2*4=8;而x|y=6(110),6&2=2、6&4=4,乘积刚好等于2*4=8。
修复后的代码方案
我们可以先判断是否存在符合要求的i,再针对性处理,彻底避免死循环:
#include <iostream> #include <algorithm> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); long long t; cin >> t; while (t-- > 0) { long long x, y, l, r; cin >> x >> y >> l >> r; long long required = x | y; long long ans = -1; long long max_product = -1; // 情况1:存在完全满足条件的i if (required <= r) { ans = required; } else { // 情况2:区间内无完全满足的i,找乘积最大的i for (long long i = l; i <= r; ++i) { long long product = (x & i) * (y & i); if (product > max_product) { max_product = product; ans = i; } } } cout << ans << '\n'; } return 0; }
额外优化说明
- 加上
ios::sync_with_stdio(false);和cin.tie(nullptr);可以大幅加速输入输出,避免因测试用例过多导致超时。 - 如果
r-l的范围非常大(比如1e9),遍历会超时,这时候需要用数位DP或者贪心的方法来找最优的i,但上面的代码先保证了正确性,适合大多数场景。
内容的提问来源于stack exchange,提问作者abhisheikh
相关产品推荐
相关产品推荐

