問題二都是簡單的數學問題,須注意的重點如下
1.矩陣與Split:目前題目一直在用,做運算前處理2.AND運算:並不用真的將10進位轉為2進位,就可以執行
3.GCD遞迴寫法
Problem
2:數學問題
子題1:網段ID (程式執行限制時間: 2 秒) 13分
IPv4的IP位址為32位元資料,內容常表示成4個十進位數字,中間以點(.)隔開(如192.168.10.246)
那要如何從一個IP位址和子網路遮罩得知網段ID呢?
實際的情形是:當知道 IP位址 和 子網路遮罩 (都是二進位數字)之後,可使用一個 AND 的二進位邏輯運算,來求出網段ID。我們任選一個 IP位址來做例子﹕
IP位址:139.175.153.252 換成二進位是﹕
10001011.10101111.10011001.11111100
10001011.10101111.10011001.11111100
給予子網路遮罩是255.255.0.0,換成二進位﹕
11111111.11111111.00000000.00000000
11111111.11111111.00000000.00000000
然後將IP位址和子網路遮罩以 AND 運算﹕
10001011.10101111.10011001.11111100
AND
11111111.11111111.00000000.00000000
10001011.10101111.10011001.11111100
AND
11111111.11111111.00000000.00000000
得出﹕
10001011.10101111.00000000.00000000
10001011.10101111.00000000.00000000
換成十進位就是139.175.0.0,這個就是網段ID了。
範例:
測試資料會有IP位址/子網路遮罩資訊,寫一程式計算網段ID。
IP 位址
|
192.168.10.65
|
11000000.10101000.00001010.010
00001
|
子網路遮罩
|
255.255.255.224
|
11111111.11111111.11111111.111
00000
|
網段ID
|
192.168.10.64
|
11000000.10101000.00001010.010
00000
|
IP位址
|
10.240.168.19
|
00001010.11110000.10
101000.00010011
|
子網路遮罩
|
255.255.192.0
|
11111111.11111111.11
000000.00000000
|
網段ID
|
10.240.128.0
|
00001010.11110000.10
000000.00000000
|
For k = 0 To 3 '每個IP 分四段
SW.Write(Integer.Parse(tempNet(k)) And Integer.Parse(tempMask(k)))
If k <> 3 Then SW.Write(".")
Next
子題2:最大公約數計算。(程式執行限制時間: 2 秒) 12分
最大公因數(Greatest Common Ditvisor,簡寫為GCD),算出二個正整數共有因數。例如數字20,8的最大公因數(GCD)為4。
GCD(20,8)=4
給你M個正整數,任二個正整數,找出他們所有之中最大的一對GCD值。
關鍵程式碼:
Function GCD(a As Long, b As Long) As Long
If b = 0 Then Return a
Return GCD(b, a Mod b)
End Function
留言
張貼留言