中国剩余定理,百度一下,就有它的定义与证明。
这里我就讲一个例子就好了。
题目的意思就是给你p,e,i,d。(n + d)% 23 = p,(n + d) % 28 = e,(n + d) % 33 = i。求最小n。
将n+d看成一个整体,m =n + d。
要求m:
先使 28 * 33 * a % 23 = 1,求出a,x = 28 * 33 * a;
使 23 * 33 * b % 28 = 1,求出b,y = 23 * 33 * b;
使23 * 28 * c % 33 = 1,求出c,z = 23* 28 * c;
m = (p*x + e*y + i*z)% (23,28,33)的最小公倍数。
先求出x ,y,z。
<span style="white-space:pre">	</span>int x, y, z;
	int a = 1;
	while((28 * 33 * a % 23) != 1)
	{
		a++;
	}
	x = 28 * 33 * a;
	a = 1;
	while((23 * 33 * a % 28) != 1)
	{
		a++;
	}
	y = 23 * 33 * a;
	a = 1;
	while((23 * 28 * a % 33) != 1)
	{
		a++;
	}
	z = 23 * 28 * a;
	cout << x << ' ' << y << ' ' << z << endl;k = lcm(23, 28,33),k = 21252
下面的是AC的代码:
#include <iostream>
using namespace std;
int main()
{
	int p, e, i, d, count = 1;
	int k = 21252;
	int x = 5544, y = 14421, z = 1288;
	while(cin >> p >> e >> i >> d)
	{
		if(p == -1 && e == -1 && i == -1 && d == -1)
			break;
		int m = (p * x + y * e + z * i) % k;
		if(m - d == 0)
			m = 21252;
		else if(m - d < 0)
		{
			m = m - d;
			m += 21252;
		}
		else
			m -= d;
		cout << "Case " << count++ << ": the next triple peak occurs in " << m << " days." << endl;
	}
	return 0;
}
原文:http://blog.csdn.net/qq_25425023/article/details/46489363