根據距離等級(A-E)和一天三個時段(日 8:00-18:00,晚 18:00-22:00,夜 22:00-8:00)計算通話費。費率表給定。通話跨時段按各段分鐘數分別計費。不足 1 分鐘不計費,最長不超 24 小時。輸入格式:等級 號碼 起始時 分 結束時 分。單行 # 結束。輸出:號碼 日分鐘 晚分鐘 夜分鐘 等級 總費用(格式固定)。
將時間轉換為分鐘數 S, E。若 S < E 遍歷 [S+1, E];若 S == E 遍歷 [S+1, 1440] 和 [1, E];若 S > E 同 S==E。每分鐘根據所在時段累加對應費率,並統計三時段分鐘數。最後按格式輸出。
#include <iostream>
#include <cstdio>
using namespace std;
struct Rate { char step; double day, eve, nig; };
Rate r[5] = {
{'A',0.10,0.06,0.02}, {'B',0.25,0.15,0.05},
{'C',0.53,0.33,0.13}, {'D',0.87,0.47,0.17},
{'E',1.44,0.80,0.30}
};
inline double getPrice(int minute, int idx, int &d, int &e, int &n) {
if (minute <= 480) { n++; return r[idx].nig; }
if (minute <= 1080) { d++; return r[idx].day; }
if (minute <= 1320) { e++; return r[idx].eve; }
{ n++; return r[idx].nig; }
}
int main() {
char step, num[10];
int sh, sm, eh, em;
while (scanf(" %c", &step), step != '#') {
scanf("%s %d %d %d %d", num, &sh, &sm, &eh, &em);
int idx=0; while(r[idx].step!=step) idx++;
int S=sh*60+sm, E=eh*60+em;
int d=0, ev=0, n=0; double cost=0;
if (S < E) {
for(int i=S+1;i<=E;i++) cost+=getPrice(i,idx,d,ev,n);
} else {
for(int i=S+1;i<=1440;i++) cost+=getPrice(i,idx,d,ev,n);
for(int i=1;i<=E;i++) cost+=getPrice(i,idx,d,ev,n);
}
printf("%10s%6d%6d%6d%3c%8.2lf\n", num, d, ev, n, step, cost);
}
return 0;
}
%10s 右對齊號碼,%6d 三時段分鐘右對齊,%3c 等級,%8.2lf 費用保留兩位小數右對齊。