07/15/2025

一道小学入门题,从余数相同问题引出函数递归,并延伸到质因数分解


题目描述

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

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

输入格式

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

输出格式

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

输入输出样例

输入
1
300 262 205
输出
1
19

一道入门问题,只为了完成该任务直接选择无脑循环即可,但是从题目给出的数学角度出发,可以引入辗转相除法:

1
int gcd(int a, int b){return b == 0 ? a : gcd(b, a % b);}

三元运算符节省空间,函数调用步进提供最大公约数,三个多个都一样,套娃就ok。但是他题目要求的是大于1的最小的公约数,这里就牵扯到了质因数分解,因为所有公约数都蕴含在最大公约数里,考虑设计方法求出所有质因数:设计循环,从2开始,每一个数都除干净,

1
2
循环上限为 <= sqrt(n) 的所有质数,因为如果a <= b, a * b = n; 那么 a * a <= a * b = n;
同时b也可以做质因数分解,因此只需要考虑上限内的质数,如果都不满足,那么该数就是质数。

用上述方法我们就将公倍数质因数分解成功,并从中找到了最小的非1公倍数!