zoukankan      html  css  js  c++  java
  • POJ 1006 Biorhythms 中国的法律来解决剩余的正式

    这个问题以前用模拟的方法来解决亚军,正如溶液是一个通用的解决方案。

    这里使用数学方法:剩下的孙子法(当然,被称为中国剩余法)。由于建议的孙子。所以也承认外国的孙子是数学家。

    参考数论建议大家学习的专业书籍法律;

    在这里,颜格依照数论的方法写出全过程的程序,不像某些博客仅仅给出终于步骤。方便大家结合程序和专业书本学习这个定律。


    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/,只有经过作者同意转载。

  • 相关阅读:
    (二)处理视频
    vim下多行注释与解注释
    (一)读取显示图片
    解决死锁的方法
    死锁、活锁和饿死的理解(转)
    C# winfrom 窗体的StartPosition 属性
    Show()和ShowDialog()
    WinForm应用程序之注册模块的设计与实现
    Epplus使用教程1(基本介绍)
    C#中操作txt,抛出“正由另一进程使用,因此该进程无法访问此文件”
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4870722.html
Copyright © 2011-2022 走看看