2039: 【作】余数相同问题

内存限制:256 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:2 解决:2

题目描述

已知三个正整数a,b,c。现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。

请问满足上述条件的x的最小值是多少?数据保证x有解。

输入

一行,三个不大于1000000的正整数a,b,c,两个整数之间用一个空格隔开。

输出

一个整数,即满足条件的x的最小值。

样例输入 复制

300 262 205

样例输出 复制

19

提示

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int a, b, c;
    cin >> a >> b >> c;

    // 同余定理:余数相同,则两数之差能被x整除,先求两两差值绝对值
    int d1 = abs(a - b);
    int d2 = abs(a - c);
    int d3 = abs(b - c);

    int min_x;
    // 根据数论要求,x必须大于1,从2开始从小到大找,第一个符合条件就是最小值
    for (int x = 2; ; x++)
    {
        // 判断x是否同时整除三个差值(同余判定条件)
        if (d1 % x == 0 && d2 % x == 0 && d3 % x == 0)
        {
            min_x = x;
            break;
        }
    }

    cout << min_x << endl;
    return 0;
}

#include <iostream>
#include <cmath>
using namespace std;

// 求两个数最大公约数(辗转相除法,数论基础算法)
int gcd(int m, int n)
{
    while (n != 0)
    {
        int t = m % n;
        m = n;
        n = t;
    }
    return m;
}

int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    int d1 = abs(a - b);
    int d2 = abs(a - c);
    int d3 = abs(b - c);

    // 先求三个差值的最大公约数,所有合法x都≤g
    int g1 = gcd(d1, d2);
    int g = gcd(g1, d3);

    int ans;
    for (int x = 2; x <= g; x++)
    {
        if (d1 % x == 0 && d2 % x == 0 && d3 % x == 0)
        {
            ans = x;
            break;
        }
    }
    cout << ans;
    return 0;
}