java 余数相同问题 【题目描述】 已知三个正整数a,b,c。现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。 请问满足上述条件的x的最小值是多少?数据保证x有解。 【输入】 一行,三个不大于1000000的正整数a,b,c,两个整数之间用一个空格隔开。 【输出】 一个整数,即满足条件的x的最小值。 【输入样例】 300 262 205 【输出样例】 19
时间: 2024-03-21 15:40:24 浏览: 296
这个问题可以使用数学方法解决。设x除以a、b、c得到的余数为r,则可以得到以下三个方程:
```
x = a*k1 + r
x = b*k2 + r
x = c*k3 + r
```
其中,k1、k2、k3都是整数。将第一个方程代入第二个方程和第三个方程,可以得到以下两个方程:
```
a*k1 + r = b*k2 + r
a*k1 + r = c*k3 + r
```
将两个方程化简,得到:
```
a*k1 = b*k2
a*k1 = c*k3
```
由于a、b、c都是正整数,因此k1、k2、k3之间必然存在公约数d,使得k1 = d*m1,k2 = d*m2,k3 = d*m3。将上面两个方程代入,得到:
```
a*d*m1 = b*d*m2
a*d*m1 = c*d*m3
```
两个方程都除以d和a,得到:
```
m1 = b/d*m2
m1 = c/d*m3
```
因为m1、m2、m3都是整数,所以b/d和c/d必须是m1的因数。因此,我们只需要求出b/d和c/d的最大公约数即可。最小的满足条件的x就是a乘以这个最大公约数。
Java代码如下:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
int c = scanner.nextInt();
int d = gcd(b/a, c/a); // 求 b/a 和 c/a 的最大公约数
System.out.println(a * d);
}
// 求最大公约数的函数
private static int gcd(int x, int y) {
if (y == 0) {
return x;
} else {
return gcd(y, x % y);
}
}
}
```
该程序首先读入a、b、c三个整数。然后,计算b/a和c/a的最大公约数,调用gcd函数实现。最后,输出a乘以最大公约数的结果。
阅读全文