跳到主要內容

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

留言

這個網誌中的熱門文章

[EXCEL]以VBA與巨集自動化修改日期格式

在工作上可能會遇上的問題,在此紀錄與分享一下。 問題:Excel中輸入日期,有些人輸入108/7/8、108.3.5等等格式要怎麼統一成 1080506這樣的 格式呢? 步驟一:先以內建函數轉換(取代)日期 要認識的基本函數 IF、Mid、Left、Right、Substitute 進行取代 IF( MID(RIGHT(A1,2),1,1)="/" , IF(RIGHT(LEFT(A1,6),1)="/" ,SUBSTITUTE(SUBSTITUTE(A1,"/","0",2),"/","0",1),SUBSTITUTE(SUBSTITUTE(A1,"/","0",2),"/","",1)),IF( RIGHT(LEFT(A1,6),1)="/" , SUBSTITUTE(SUBSTITUTE(A1,"/","",2),"/","0",1) ,SUBSTITUTE(SUBSTITUTE(A1,"/","",2),"/","",1))) 第一個IF是用來判斷"日"的格式,舉例來說108/5/6,Right(A1,2)會取出"/6",再用Mid設定取第1個字"/",108/5/16,Right(A1,2)會取出"16",再用Mid設定取第1個字"1", 這也代表如果是1-9日可以讓她進行補0的動作。 第二個IF是用來判斷"月"的格式,與上面用取法類似。 步驟二:建立自訂函數 改為VBA格式,建立一個自己設定的函數SubstituteDate() Function SubstituteSlash(A1)     If InStr(A1, "/") > 0 Then           ...