2015年5月22日 星期五

d060:還要等多久啊?(5)

d060: 還要等多久啊?(5)

更新時間:2016/12/20
內容
  文文又想打電話給珊珊,可是這次他碰到了另一個問題。珊珊說他們學校每堂課 50 分鐘,下課的時間都是整點過後 25 分,休息 10 鐘後再上下一節課。文文不想打擾珊珊上課,也不想才剛打通電話她就要上課去了,因此他決定一定要在剛好 25 分的時候打電話給她。給你現在時間的分,請你幫他算算看還要等多久才能打電話給珊珊?
輸入說明
  輸入只有一行,包含現在時間的分 m (0 ≤ m ≤ 59)。
輸出說明
  輸出還要等幾分鐘文文才能打電話。
範例輸入
  20
範例輸出
  5
提示
背景知識
  算術運算子
你能只用算術運算子來求出解答,而不需要用到 if 指令嗎?


想一想,再看解答~


我的解題想法:
  以25分為基準,直接扣掉現在時間的分 m 。
會產生三種情況:

(A)如果現在時間等於25分,結果為0,不必等待就可以打電話。
(B)如果現在時間小於25分,結果為正數(1~25),就是等待時間。
(C)如果現在時間大於25分,結果為負數(-34~-1),就必須等待下一小時的25分。也就是說,從這一小時的25分到下一小時的25分,時間已經流逝的分鐘數。例如現在時間為40分,25-40=-15,到下一小時的60分鐘內,已經流逝15分鐘,也就是說再等45分鐘就是下一小時的25分。
如果你只想到這邊,肯定要用到判斷式才能解決此問題。
再多想一點...

我們把這三種情況位移60(結果+60),此時三種情況分別為:
(A) 0 +60 = 60
(B)(1~25) +60 =(61~75)
(C)(-34~-1) +60 =(26~59)
最後除以60取其餘數:
(A) 60 % 60 = 0
(B)(61~75) % 60 = (1~25)
(C)(26~59) % 60 = (26~59)
經過基準點、位移與同餘的步驟後,結果就是文文必須等待的時間。



程式碼:
#include <stdio.h>
int main(void){
    int m;
    scanf("%d",&m);
    printf("%d",(25-m+60)%60);
    return 0;
}
程式碼解析
#1:引入標準輸入/輸出串流。
#2:主程式開始,回傳引數int,沒有參數。
#3:宣告一個整數(int)變數「m」,範圍–2,147,483,648 到 2,147,483,647。
#4:從標準輸入讀取格式化數據。讀取1個整數(%d),指定值給「m」。
#5:將格式化數據顯示到標準輸出。輸出1個整數(%d)「(25-m+60)%60」。
#6:主程式回傳整數「0」。
#7:主程式結束。