题解
余数相同问题
1 条题解
-
0
解题思路
如果
a % x == b % x,说明x能整除a - b。同理余数都相同,x必须同时整除a-b和b-c,所以x是gcd(|a-b|, |b-c|)的大于 1 的因子。用辗转相除法求最大公约数,再从 2 开始找它的最小因子就是答案。如果三个数相等(gcd 为 0),任何除数余数都相同,题目约定输出 0。
参考代码
#include <iostream> using namespace std; // 函数:用辗转相除法求两个数的最大公约数 int gcd(int x, int y) { while (y) { // 一直除到余数为0 int t = x % y; // 求余数 x = y; // 新的被除数换成原来的除数 y = t; // 新的除数换成余数 } return x; // 返回最大公约数 } int main() { int a, b, c; cin >> a >> b >> c; int d1 = a - b > 0 ? a - b : b - a; // |a-b| int d2 = b - c > 0 ? b - c : c - b; // |b-c| int g = gcd(d1, d2); if (g == 0) { // 三个数都相等,题目约定输出0 cout << 0 << endl; return 0; } for (int x = 2; x <= g; x++) { if (g % x == 0) { // 找到最小的大于1的因子 cout << x << endl; break; } } return 0; }复杂度分析
辗转相除求 gcd 很快,找因子最多循环 g 次,时间复杂度 O(g),额外空间复杂度 O(1)。
- 1