1. 程式人生 > >POJ1006.Biorhythms(生物節律)

POJ1006.Biorhythms(生物節律)

【題意】
人生來就有三個生理週期,分別為:體力、感情和智力週期,週期長度分別為23天、28天和33天。
因為三個週期的周長不同,所以通常三個週期的高峰不會落在同一天。對於每個人,我們想知道何時三個高峰落在同一天。
對於每個週期,我們會給出從當前年份的第一天開始,到出現高峰的天數(不一定是第一次高峰出現的時間)。你的任務是給定一個從當年第一天開始數的天數,輸出從給定時間開始(不包括給定時間)下一次三個高峰落在同一天的時間(距給定時間的天數)。
例如:給定時間為10,下次出現三個高峰同天的時間是12,則輸出2(注意這裡不是3)。

【思路】

週期性問題充分利用%運算。
列舉:從d+1到21252每一天取餘三個週期是否都為零,若滿足則是所求。但這樣做耗時無疑很高,所以進行優化。要充分利用週期性質,即當找到滿足某一個週期的日子後,滿足三個週期的日子必然在該日期的當前日子加上對應週期倍數的日子上,利用這個性質大大優化搜尋效率。

#include<stdio.h>
int main()
{
    int x,tcase,d,d1,d2,d3;
    tcase=0;
    while(scanf("%d%d%d%d",&d1,&d2,&d3,&d))
    { 
        if(d1==-1&&d2==-1&&d3==-1&&d==-1)
            break;
        for(x=d+1;x<=21252;x++)
            if((x-d1)%23==0)
                break;
        for(;x<=21252;x+=23)
            if((x-d2)%28==0)
                break;
        for(;x<=21252;x+=23*28)
            if((x-d3)%33==0)
                break;
        printf("Case %d: the next triple peak occurs in %d days.\n",++tcase,x-d);
    }
    return 0;
}