这个问题以前用模拟的方法来解决亚军,正如溶液是一个通用的解决方案。
这里使用数学方法:剩下的孙子法(当然,被称为中国剩余法)。由于建议的孙子。所以也承认外国的孙子是数学家。
参考数论建议大家学习的专业书籍法律;
在这里,颜格依照数论的方法写出全过程的程序,不像某些博客仅仅给出终于步骤。方便大家结合程序和专业书本学习这个定律。
int g, s, t; const int m1 = 23; const int m2 = 28; const int m3 = 33; void extGCD(int a, int b) { if (b == 0) { s = 1, t = 0, g = a; } else { extGCD(b, a % b); int tmp = s; s = t; t = tmp - a / b * t; } } int a, b, c, m; void preCalculateABCM() { m = m1 * m2 * m3; //本题==21252 int M1 = m / m1; int M2 = m / m2;//=759 int M3 = m / m3; extGCD(M1, m1); int y1 = s; if (y1 < 0) { int y = -y1; y %= m1; y1 = m1 - y; } extGCD(M2, m2); int y2 = s; if (y2 < 0) { int y = -y2; y %= m2; y2 = m2 - y; } extGCD(M3, m3); int y3 = s; if (y3 < 0) { int y = -y3; y %= m3; y3 = m3 - y; } a = M1 * y1; b = M2 * y2; c = M3 * y3; } int meetDates(int p, int e, int i, int d) { //p %= m1, e %= m2, i %= m3; int x = p * a + e * b + i * c; x %= m; if(x <= d) x = m - (d - x); else x = x - d; return x; } int main() { preCalculateABCM(); int p,e,i,d, n = 0; while (cin>>p>>e>>i>>d && -1 != d) { n++; printf("Case %d: the next triple peak occurs in %d days. ", n, meetDates(p, e, i, d)); } return 0; }
版权声明:笔者靖心脏,景空间地址:http://blog.csdn.net/kenden23/,只有经过作者同意转载。