c++有一堆机器零件(零件个数小于 100),3 个为一组则剩下 2 个,5 个为一组则剩 下 1 个,7 个为一组则剩下 6 个,求这堆零件一共有多少个? 函数原型:int calc(int x[], int len);
时间: 2024-02-19 12:03:52 浏览: 74
统计字符串中字母和数字个数
这个问题可以用中国剩余定理来解决,和之前的问题一样。
设该零件的数量为 n,则有:
n ≡ 2 (mod 3)
n ≡ 1 (mod 5)
n ≡ 6 (mod 7)
根据中国剩余定理,可以得到:
n ≡ 23 (mod 105)
因此,该零件的数量为 105k + 23,其中 k 为任意整数。
代码实现如下:
```c++
int calc(int x[], int len) {
int a[] = {3, 5, 7};
int b[] = {2, 1, 6};
int M = 1;
for (int i = 0; i < 3; i++) {
M *= a[i];
}
int ans = 0;
for (int i = 0; i < 3; i++) {
int Mi = M / a[i];
ans += b[i] * Mi * inv(Mi, a[i]);
}
return ans % M;
}
int inv(int a, int b) {
int b0 = b, t, q;
int x0 = 0, x1 = 1;
if (b == 1) return 1;
while (a > 1) {
q = a / b;
t = b, b = a % b, a = t;
t = x0, x0 = x1 - q * x0, x1 = t;
}
if (x1 < 0) x1 += b0;
return x1;
}
```
其中,inv 函数是求逆元的函数,可以用扩展欧几里得算法实现。
调用 calc 函数即可得到结果,例如:
```c++
int x[] = {2, 1, 6};
int len = 3;
int n = calc(x, len);
cout << n << endl; // 输出 23
```
阅读全文