top1编程
← 返回题目
题解

余数相同问题

1 条题解

  • 0
    @ 2026-8-5 0:36:21

    解题思路

    如果 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