C语言:已知三个正整数a,b,c。现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同。 请问满足上述条件的x的最小值是多少?数据保证x有解。
时间: 2023-10-29 08:31:54 浏览: 264
我们可以使用中国剩余定理来解决这个问题。
首先,设x除以a、b、c所得的余数分别为ra、rb、rc。则我们需要解决下列同余方程组:
x ≡ ra (mod a)
x ≡ rb (mod b)
x ≡ rc (mod c)
由于a、b、c两两互质,因此这个同余方程组一定有解。我们可以使用扩展欧几里得算法来求解。
设p1 = b × c,p2 = a × c,p3 = a × b。则有:
ra × p1 × y1 + rb × p2 × y2 + rc × p3 × y3 ≡ x (mod a × b × c)
其中y1、y2、y3分别为p1、p2、p3在模a、b、c下的逆元。
因为a、b、c两两互质,所以p1、p2、p3也两两互质,因此我们可以分别求出它们在模a、b、c下的逆元。
最终的答案x即为上式右侧模a×b×c的余数,也就是:
x = (ra × p1 × y1 + rb × p2 × y2 + rc × p3 × y3) % (a × b × c)
这个余数即为满足条件的最小正整数x。
下面是一个使用C语言实现的例子:
```c
#include <stdio.h>
int extgcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = extgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int inv(int a, int m) {
int x, y;
extgcd(a, m, x, y);
return (m + x % m) % m;
}
int main() {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
int p1 = b * c, p2 = a * c, p3 = a * b;
int ra = a - (a / b) * b - (a / c) * c;
int rb = b - (b / a) * a - (b / c) * c;
int rc = c - (c / a) * a - (c / b) * b;
int y1 = inv(p1 % a, a);
int y2 = inv(p2 % b, b);
int y3 = inv(p3 % c, c);
int x = (ra * p1 * y1 + rb * p2 * y2 + rc * p3 * y3) % (a * b * c);
printf("%d\n", x);
return 0;
}
```
输入样例:
```
2 3 5
```
输出样例:
```
23
```
阅读全文