2017年1月26日 星期四

Z2A_VB_寒輔練習之一

參考解
   Function M4P12(ByVal s As String) As String
        ' M4P12_N!尾數的0
        Dim x As Integer = s
        Dim cnt As Integer = 0
        For i = 5 To x Step 5
            Dim k As Integer = i
            Do While k Mod 5 = 0  ' 5的次方數會被整除多次
                cnt += 1
                k \= 5
            Loop
        Next
        Return cnt '1~x 共被5整除幾次就有幾個 尾數0
    End Function

    Function M4P21(ByVal s As String) As String
        ' M4P21_計程車費率計算
        Dim x As Integer = s * 1000 - 1500  '扣掉起跳 1500公尺
        Dim ans As Integer = 85 '起跳 85元
        If x < 0 Then Return ans '小於1500公尺只收 85
        ans += 5 * (x \ 250)
        If x Mod 250 <> 0 Then ans += 5
        Return ans ' 超過1500公尺的 \250每單位5元,餘數不為0再+5元
    End Function

    Function M4P22(ByVal s As String) As String
        ' M4P22_迴文
        Dim n As Integer = s.Length '字串長度
        Dim m As Integer = n \ 2  '字串長度的一半
        '由第1字與最後1字比,第2字與倒數第2字比, … 第m字與倒數第m字比
        For i = 1 To m
            If Mid(s, i, 1) <> Mid(s, n - i + 1, 1) Then Return "N"
        Next
        Return "Y" ' 皆沒有不同,即是迴文
    End Function

 Private Sub Button4_Click( . . .) Handles Button4.Click
        ' F4P11_電梯電費計算系統 ,輸入有兩列,以兩個文字方塊讀入s1,s2
        Dim s1 As String = TextBox1.Text '例:7
        Dim s2 As String = TextBox2.Text '例:2,9,7,3,4,6,1
        Label1.Text = F4P11(s1, s2)

    End Sub
  Function F4P11(ByVal s1 As String, ByVal s2 As String) As String
        ' F4P11_電梯電費計算系統
        Dim x As Integer = s1 '共停過x個樓層
        Dim dat() = s2.Split(",")  '有哪幾層以,號隔開:split切好分成dat(0)~dat(x-1)
        Dim ans As Integer = 0
        For i = 1 To x - 1
            Dim f As Integer = dat(i)
            If f > dat(i - 1) Then
                ans += 20 * (f - dat(i - 1))
            Else
                ans += 10 * (dat(i - 1) - f)
            End If
        Next
        Return ans
    End Function

    Function F4P22(ByVal s As String) As String
        ' F4P22_最大公約數計算
        Dim dat() = s.Split(",") ' '共有以,號隔開不一定幾個[假設m個]的數字:split切好分成dat(0)~dat(m-1)
        Dim m As Integer = dat.Length
        Dim ans As Integer = dat(0)
        For i = 1 To m - 1
            ans = gcd(ans, dat(i))
        Next
        Return ans
    End Function
    Function gcd(ByVal a As Integer, ByVal b As Integer) As Integer
        '求兩個非0正整數a,b的最大公約數, 運算後 更新後的 b即是
        Dim r As Integer = a Mod b
        Do Until r = 0
            a = b
            b = r
            r = a Mod b
        Loop
        Return b
    End Function
   

    Function F4P31(ByVal s As String) As String
        ' F4P31_計算位元為1的個數
        Dim x As Integer = s
        Dim cnt As Integer = 0  '位元1有幾個
        Do Until x = 0
            cnt += x Mod 2
            x \= 2
        Loop
        Return cnt ' 除2的餘數為1 加入 cnt
    End Function

    Function M5P42(ByVal s As String) As String
        ' M5P42_十進制數轉二進制數
        Dim dat() = s.Split(",")
        dat(0) = StrReverse(dat(0))  ' 或 Strings.StrReverse 將字串內容反轉
        dat(1) = StrReverse(dat(1))
        Dim x As Integer = dat(0), y As Integer = dat(1)
        Dim sum As Integer = StrReverse(x + y)
        Dim ans As String = ""
        ' 以下將 sum轉為 二進制,每除2一次的餘數串在前面
        Do While sum <> 0
            ans = sum Mod 2 & ans
            sum \= 2
        Loop
        Return ans

    End Function

2017年1月2日 星期一

Z3A_Net 幻方參考


奇階幻方  產生的方式有多種,為了方便驗證,我們規定
(1)   由最上面列的中間格開始填入1
(2)   接續格在前一格的左上方{例如 4填入後填5},除非超出邊界或格內已填數字如說明(3)(4)(5)(6)
(3)   超出上邊界,則接續格改為左邊一行的最下一列{例如 1填入後填2},除非超出左邊界如說明(6)
(4)   超出左邊界,則接續格改為上邊一列的最右一行{例如 2填入後填3},除非超出上邊界如說明(6)
(5)   若接續格已填有數字 {例如 3填入後要填4,接續格改為原格下方一格
(6)   若上邊及左邊同時超出邊界時,接續格改為原格的下方一格{例如 6填入後要填7}

以下為3x3的產生步驟


,以及3階及5的完成圖


4N階幻方產生的方式有多種,為了方便驗證,我們規定如下{以8階為例}
(1)   由最左上格開始填入1,接著往右填2至8,一列填滿後接著第2列第1格填9,直到填滿64格如下圖
(2)   每方形16格,分成4x4的子區域,每個子區域劃出對角線,將有劃線的數字 1 4 5 8 10 61 64 移出如下 
(3)   將被移出的數字 1 4 5 8 10  61 64,由小至大倒著填入空格中如圖,最後填滿即完成 




6階及4N+2階幻方產生的方式有多種,為了方便驗證,我們規定如下{以6,10階為例}




2017年1月1日 星期日

Z2A VB檢查碼+變化2,3

變化2M5P05_2 書碼檢查(10)
 給一組書碼,依下列檢查規則,若正確則輸出Yes,不正確則輸出No
(1) 書碼共10碼皆數字,非數字或長度不對則No
(2) 1~9碼由左算第1碼為奇數位
所有奇數位*1、所有偶數位*3
(3) 1~9位各乘上1 3後加總後再加上第10*1須能被10整除
in1.txt
2
1234567891
9876543215

in2.txt
2
2234567894
9976543211

out.txt
No
Yes

Yes
No
參考程式碼
   Function M5P05_2(ByVal s As String) As String
        M5P05_2 = "Yes"
        If s.Length <> 10 Then Return "No"
        Dim sum As Integer = 0
        For i = 1 To 10
            If Mid(s, i, 1) < "0" Or Mid(s, i, 1) > "9" Then Return "No"
            Dim a As Integer = Val(Mid(s, i, 1))
            Select Case i Mod 2
                Case 1
                    sum += a * 1
                Case 0
                    If i = 10 Then sum += a Else sum += a * 3
            End Select
        Next
        If sum Mod 10 <> 0 Then Return "No"
    End Function
變化3M5P05_3 二信資處發票檢查
 給一組二信資處合作社的發票,避免冒領獎金,依下列檢查規則,
若正確則輸出OK,不正確則輸出KO
(1) 發票號碼長度有可能7~9碼皆數字,非數字或長度不對則KO
(2) 1,4,7*3、第2,5,8*2、第3,6,9*5,若無8,9碼當然不用乘
(3) 各碼分別乘上3,2,5後加總的和須能被7整除則OK否則KO
in1.txt
2
123456794
9876543

in2.txt
2
223456789
98765436

out.txt
OK
KO

KO
OK
參考程式碼
   Function M5P05_3(ByVal s As String) As String
       M5P05_3 = "OK"
        If s.Length < 7 Or s.Length > 9 Then Return "KO"
        Dim sum As Integer = 0
        For i = 1 To s.Length
            If Mid(s, i, 1) < "0" Or Mid(s, i, 1) > "9" Then Return "KO"
            Dim a As Integer = Val(Mid(s, i, 1))
            Select Case i Mod 3
                Case 1
                    sum += a * 3
                Case 2
                    sum += a * 2
                Case 0
                    sum += a * 5
            End Select
        Next
        If sum Mod 7 <> 0 Then Return "KO"

    End Function

Z2A VB 檢查碼變化題

Z2A VB 01/03預訂考題 檢查碼之 變化
變化1M5P05_1 學號檢查
 給一組學號,依下列檢查規則,若正確則輸出Yes,不正確則輸出No
(1) 學號共6碼,長度不對則No
(2) 1碼只能3~5
(3) 2,3兩碼只能11~17的數字
(4) 4,5,6三碼只能001~350的數字
in1.txt
2
4112A9
416123

in2.txt
2
511099
616123

out.txt
No
Yes

Yes
No
參考程式碼
   Function M5P05_1(ByVal s As String) As String
        M5P05_1 = "Yes"
        If s.Length <> 6 Then Return "No"
        For i = 1 To s.Length
            If Mid(s, i, 1) < "0" Or Mid(s, i, 1) > "9" Then Return "No"
        Next
        Dim a As Integer = Val(Mid(s, 1, 1))
        Dim b As Integer = Val(Mid(s, 2, 2))
        Dim c As Integer = Val(Mid(s, 4, 3))
        If a < 3 Or a > 5 Then Return "No"
        If b < 11 Or b > 17 Then Return "No"
        If c < 1 Or a > 350 Then Return "No"
    End Function

變化2M5P05_2 書碼檢查(10)
 給一組書碼,依下列檢查規則,若正確則輸出Yes,不正確則輸出No
(1) 書碼共10碼皆數字,非數字或長度不對則No
(2) 1~9碼由左算第1碼為奇數位
所有奇數位*1、所有偶數位*3
(3) 1~9位各乘上1 3後加總後再加上第10*1須能被10整除

變化3M5P05_3 二信資處發票檢查
 給一組二信資處合作社的發票,避免冒領獎金,依下列檢查規則,
若正確則輸出OK,不正確則輸出KO
(1) 發票號碼長度有可能7~9碼皆數字,非數字或長度不對則KO
(2) 1,4,7*3、第2,5,8*2、第3,6,9*5,若無8,9碼當然不用乘
(3) 各碼分別乘上3,2,5後加總的和須能被7整除則OK否則KO


 變化2、變化3 的資料及程式碼後補