You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码无限输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:47:36