> 分析
>> 因为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 }
时间: 2024-10-31 05:11:56