码迷,mamicode.com
首页 > 其他好文 > 详细

POJ-1006: biorhythms 详解2: 叠加取余

时间:2015-08-09 12:06:40      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

> 分析

  >> 因为days可能小于p, e, i, 所以首先让p,e,i等于各自第一次循环的起点
  >> 分三步进行叠加, 根据题意days从 d+1 开始
     1. 计算第一个 days % 23 == p 的点(这一步可以一次计算出来)
     2. 从上一步的结果开始,找到第一个 days % 28 == e 的点, 每次增加 23
     3. 从上一步的结果开始,找到第一个 days % 33 == i 的点, 每次增加 23 * 28
 
> 注意
  >> 计算出days一定要大于d, 因此循环可以直接从 d+1开始
  >> 如果使用了循环结束判断,则注意days <= 21252 + 365
 
> 附代码
 1 /* ------------------------------
 2  * 叠加取余
 3  * ----------------------------*/
 4 #include "stdio.h"
 5 
 6 #define CYCLE_P 23
 7 #define CYCLE_E 28
 8 #define CYCLE_I 33
 9 
10 int main(void)
11 {
12     int p = 0, e = 0, i = 0, d = 0 ;
13     int count = 0 ;
14     int days = 0 ;
15 
16     while(1)
17     {
18         scanf("%d %d %d %d", &p, &e, &i, &d) ;
19         if(-1 == d)
20             break ;
21 
22         p = p % CYCLE_P ;
23         e = e % CYCLE_E ;
24         i = i % CYCLE_I ;
25         
26         days = d + 1;
27     
28         if(days <= p)
29             days = p ;
30         else    
31             days += CYCLE_P - (days - p) % CYCLE_P ;
32 
33         while(days % CYCLE_E != e)
34             days += CYCLE_P ;
35 
36         while(days % CYCLE_I != i)
37             days += CYCLE_P * CYCLE_E ;    
38 
39         printf("Case %d: the next triple peak occurs in %d days.\r\n",
40             ++count, days - d) ;
41     }
42 
43     return 0 ;
44 }

 

POJ-1006: biorhythms 详解2: 叠加取余

标签:

原文地址:http://www.cnblogs.com/codesworld/p/4714698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!