posts - 99,  comments - 8,  trackbacks - 0
#include <stdio.h>
#
include <stdlib.h>

#define Tp 23
#
define Te 28
#
define Ti 33

int main ()
{
    int p, e, i, d;
    
    int num 
= 1;
    
    
while (scanf ("%d%d%d%d"&p, &e, &i, &d) != EOF && (p != -1 && e != -1 && i != -1 && d != -1))
    {
          int j;
          
for ( j = 1; j <= 21252; j ++)
          {
              
if ( ((j - p) % Tp == 0) && ((j - e) % Te == 0) && ((j - i) % Ti ==0) )
              {
                   
if ( j - d > 0)
                   printf (
"Case %d: the next triple peak occurs in %d days.\n", num, j - d);
                   
else  
                        printf (
"Case %d: the next triple peak occurs in %d days.\n", num, j - d + 21252);
                   
                   
break;
              }
          }
          num 
++;
    } 
    system (
"pause");
    
return 0;
}
http://tiandiwuyong1989.blog.163.com/blog/static/122572981200962121733/

本题就是要求得满足下面条件的 x  的值:
( x - p ) % Tp = 0;    ( x - e ) % Te = 0;    ( x - i ) % Ti = 0;   
由同余可得:x % Tp  =  p % Tp    = a
                        x % Te  =  p % Te    = b
                        x % Ti   =  p % Ti     = c
再由中国剩余定理就可以知道了!
//2.用中国剩余定理解
#include <stdio.h>
#
include <stdlib.h>
int main ()
{
    int p, e, i , d, x;
    int Tp 
= 23, Te = 28, Ti = 33;
    int num 
= 1;
    
while (scanf ("%d%d%d%d"&p, &e, &i, &d ) != EOF && (p != -1 && e != -1 && i != -1 && d != -1) )
    {
          int a 
= p % Tp;
          int b 
= e % Te;
          int c 
= i % Ti;
          
          int n1, n2, n3;
          
          
for (int j = 1; j < 33; j ++)
          {
              
if ( (23 * 28 * j) % 33 == 1)
              {
                  n1 
= j;
                 
break;
              }
                 
          }
          
for (int j = 1; j < 28; j ++)
          {
              
if ( (23 * 33 * j) % 28 == 1)
              {
                  n2 
= j;
                 
break;
              }
                 
          }
          
for (int j = 1; j < 23; j ++)
          {
              
if ( (33 * 28 * j) % 23 == 1)
              {
                  n3 
= j;
                 
break;
              }
                 
          }

         
          
          x 
= (28 * 23 * n1 * c + 23 * 33 * n2 * b + 28 * 33 * n3 * a ) % (23 * 33 * 28);
          
         
if ( x - d > 0)
                   printf (
"Case %d: the next triple peak occurs in %d days.\n", num, x - d);
                   
else  
                        printf (
"Case %d: the next triple peak occurs in %d days.\n", num, x - d + 21252);
          
          num
++;
    }
    
//system ("pause");
    
return 0;

posted on 2010-08-29 11:10 雪黛依梦 阅读(411) 评论(0)  编辑 收藏 引用 所属分类: 数论

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜