两整数之和模第三数问题:代码仅通过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
相关产品推荐
相关产品推荐

