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

两整数之和模第三数问题:代码仅通过3个测试用例求助

问题排查与代码修正

你的代码没能通过全部测试用例,主要是三个核心问题导致的:

1. 输入读取不符合题目要求

题目明确第一行输入A、B,第二行输入C,但你用std::cin >> a >> b >> c;会把所有输入当成同一行处理。如果测试用例的输入是分两行的,这种读取方式会直接导致数据读错,这是很多测试用例失败的直接原因。

2. 整数溢出触发未定义行为

虽然int64_t能存下单个-1e18到1e18的数,但如果两个数都是接近上限的正数(比如9e18 + 9e18),或者都是接近下限的负数,它们的和会超出int64_t的取值范围,触发未定义行为,计算结果完全不可控。

3. 负数取模的结果不符合余数定义

C++里取模的结果符号和被除数一致,比如(-5) % 3会得到-2,但题目要求的余数应该是非负的(范围在0到C-1之间),这种负数结果会直接导致测试用例不通过。


修正后的代码

#include <iostream>
#include <cstdint>

int main() {
    int64_t a, b;
    uint64_t c;
    // 分两次读取,符合输入格式要求
    std::cin >> a >> b;
    std::cin >> c;

    // 利用模运算性质拆分计算,避免溢出
    int64_t c_int = static_cast<int64_t>(c);
    int64_t mod_a = a % c_int;
    int64_t mod_b = b % c_int;
    int64_t sum_mod = (mod_a + mod_b) % c_int;

    // 确保余数非负
    if (sum_mod < 0) {
        sum_mod += c_int;
    }

    std::cout << sum_mod << std::endl;
    return 0;
}

修正细节说明

  • 输入修复:分两次读取输入,严格匹配题目要求的两行输入格式。
  • 避免溢出:用(a%c + b%c) %c替代(a+b)%c,因为a%c的结果范围是-(c-1)到c-1,两个这样的值相加最多是2*(c-1),远小于int64_t的容量,彻底杜绝溢出。
  • 非负余数处理:如果计算出的模是负数,加上C把它转成非负值,符合余数的标准定义。
  • 类型优化:C的取值范围是≥2的正整数,用uint64_t存储更合理,转换为int64_t也不会有溢出问题。

内容的提问来源于stack exchange,提问作者Kuznetsov-M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:39:18