題目連結
題意:
電話費計算程式
有 5 種地區 A, B, C, D, E
還有分三種時段,費率各不相同
測資每行一組
分別給地區, 電話號碼, H1, M1, H2, M2
後 4 個數字代表時間區間,從 H1:M1 ~ H2:M2
計算該區間內的電話費
輸出要照格式依序輸出
前10位靠右對齊輸出電話號碼、
三個時段佔的分鐘數(各6位)、
地區(3位)、
電話費(8位)
解法:
很直觀,也很麻煩
先建地區對應時間的表
給定一個區間,如何個別統計 3 個時段佔多少呢?
這邊只是提供我的土法,一定有更快的
開一個一維陣列,表示所有分鐘
先判斷時間區間前者晚於或早於後者
如果前者較晚,表示有跨日
例如
3:00~5:00 就是同一天,共2小時
5:00~3:00 就是跨日,共22小時
題目有說區間不超過24小時
所以不用做其他判斷
(如果時間相同,如 8:00~8:00,表示跨日,經過一天)
然後按區間經過的,就在陣列註記
最後三個時間各自統計範圍內註記的總分鐘數即可
記得輸出照位數輸出
可以用跟 C 語言相同的 printf 方法
細節就不詳述
程式(Java):
題意:
電話費計算程式
有 5 種地區 A, B, C, D, E
還有分三種時段,費率各不相同
測資每行一組
分別給地區, 電話號碼, H1, M1, H2, M2
後 4 個數字代表時間區間,從 H1:M1 ~ H2:M2
計算該區間內的電話費
輸出要照格式依序輸出
前10位靠右對齊輸出電話號碼、
三個時段佔的分鐘數(各6位)、
地區(3位)、
電話費(8位)
解法:
很直觀,也很麻煩
先建地區對應時間的表
給定一個區間,如何個別統計 3 個時段佔多少呢?
這邊只是提供我的土法,一定有更快的
開一個一維陣列,表示所有分鐘
先判斷時間區間前者晚於或早於後者
如果前者較晚,表示有跨日
例如
3:00~5:00 就是同一天,共2小時
5:00~3:00 就是跨日,共22小時
題目有說區間不超過24小時
所以不用做其他判斷
(如果時間相同,如 8:00~8:00,表示跨日,經過一天)
然後按區間經過的,就在陣列註記
最後三個時間各自統計範圍內註記的總分鐘數即可
記得輸出照位數輸出
可以用跟 C 語言相同的 printf 方法
細節就不詳述
程式(Java):
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.*; | |
public class Main { | |
public static void main(String args[]) { | |
double[][] rate = { {0.10, 0.06, 0.02}, | |
{0.25, 0.15, 0.05}, | |
{0.53, 0.33, 0.13}, | |
{0.87, 0.47, 0.17}, | |
{1.44, 0.80, 0.30}}; | |
Scanner sc = new Scanner(System.in); | |
while (true) { | |
int D = 0, E = 0, N = 0; | |
boolean get[] = new boolean[1440]; | |
String[] s = sc.nextLine().split(" "); | |
if (s[0].equals("#")) | |
break; | |
int index = s[0].charAt(0) - 'A'; | |
int min1 = Integer.valueOf(s[2]) * 60 + Integer.valueOf(s[3]); | |
int min2 = Integer.valueOf(s[4]) * 60 + Integer.valueOf(s[5]); | |
if (min1 < min2) | |
for (int i = min1; i < min2; i++) | |
get[i] = true; | |
else { | |
for (int i = 0; i < min2; i++) | |
get[i] = true; | |
for (int i = min1; i < 1440; i++) | |
get[i] = true; | |
} | |
for (int i = 0; i < 480; i++) | |
N += (get[i] ? 1 : 0); | |
for (int i = 480; i < 1080; i++) | |
D += (get[i] ? 1 : 0); | |
for (int i = 1080; i < 1320; i++) | |
E += (get[i] ? 1 : 0); | |
for (int i = 1320; i < 1440; i++) | |
N += (get[i] ? 1 : 0); | |
double sum = rate[index][0] * D + rate[index][1] * E + rate[index][2] * N; | |
System.out.printf("%10s%6d%6d%6d%3s%8.2f\n", s[1], D, E, N, s[0], sum); | |
} | |
} | |
} |
留言
張貼留言