C语言11x+15y=c线性组合判断程序输出不符问题排查
问题排查与修正
首先明确核心问题:整数12无法表示为11x + 15y(x、y为非负整数)——试遍所有可能的非负y值:
- y=0时,11x=12,x不是整数
- y≥1时,15y≥15>12,剩余值为负数,x必然为负,不符合要求
你的程序输出YES,说明逻辑存在以下常见问题之一:
常见错误类型
- 循环未限制变量范围:遍历y时未在
15y > c时终止循环,导致后续计算负数剩余值,错误判定整除性 - 判断条件不完整:只检查剩余值能否被另一个系数整除,未确认剩余值非负(允许x/y为负数)
- 错误的简化逻辑:比如误以为
c >= 11或c >=15就直接返回YES,忽略了小数值的特殊情况
修正后的代码
以下是符合要求的实现,逻辑为遍历所有合法的y值(非负且15y ≤ c),检查剩余值是否为非负且能被11整除:
#include <stdio.h> int main() { int c; // 处理5个测试用例 for (int i = 0; i < 5; i++) { scanf("%d", &c); int is_possible = 0; // y的最大取值为c/15(整数除法,确保15y ≤ c) for (int y = 0; y <= c / 15; y++) { int remainder = c - 15 * y; // 剩余值非负 + 能被11整除,才存在合法x if (remainder >= 0 && remainder % 11 == 0) { is_possible = 1; break; } } printf("%s\n", is_possible ? "YES" : "NO"); } return 0; }
运行结果
输入测试用例89、234、876、99、12时,输出为:
YES YES YES YES NO
额外说明
根据数论中的贝祖定理,由于11和15互质,所有大于等于149(即11*15 -11 -15)的整数都可以表示为11x+15y(x、y非负),但小于149的数需要逐个验证,比如12就属于无法表示的范围。
内容的提问来源于stack exchange,提问作者Shark Hiuu
相关产品推荐
相关产品推荐

