跳到主要內容

105商業類技藝競賽試題Problem2


問題二都是簡單的數學問題,須注意的重點如下
1.矩陣與Split:目前題目一直在用,做運算前處理
2.AND運算:並不用真的將10進位轉為2進位,就可以執行
3.GCD遞迴寫法

Problem 2:數學問題
子題1網段ID  (程式執行限制時間: 2 ) 13

IPv4IP位址為32位元資料,內容常表示成4個十進位數字,中間以點(.)隔開(192.168.10.246)

那要如何從一個IP位址和子網路遮罩得知網段ID?
實際的情形是:當知道 IP位址 子網路遮罩 (都是二進位數字)之後,可使用一個 AND 的二進位邏輯運算,來求出網段ID。我們任選一個 IP位址來做例子﹕
IP位址:139.175.153.252 換成二進位是﹕
10001011.10101111.10011001.11111100
給予子網路遮罩是255.255.0.0,換成二進位﹕
11111111.11111111.00000000.00000000
然後將IP位址和子網路遮罩以 AND 運算﹕
10001011.10101111.10011001.11111100
AND
11111111.11111111.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

留言