2018年1月1日 星期一

To Z2A 程式選訓(1227-4,1227-5)

1227-4_撲克21點(參考解)
輸入範例:
in1.txt
3
0,2,6
13,10,11
27,36,23
in2.txt
3
26,42,8
11,25,30
39,21,22
輸出範例:
out.txt
21
21
Bom

14
Bom
20
輸出說明:

索引:點數 … 
0:1 1:3 2:7 21      11+ 3+ 7 = 21
0:1 1:10 2:10 21    1 +10+10 = 21
0:2 1:10 2:10 Bom  2 + 10+10 = 22 Bom


0:1 1:4 2:9 14      1 + 4 + 9 = 14
0:10 1:10 2:5 Bom  10+10+ 5 = 25 Bom
0:1 1:9 2:10 20     1 + 9+10 = 20

程式碼:
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Hide()
        FileOpen(1, "in1.txt", OpenMode.Input)
        FileOpen(2, "in2.txt", OpenMode.Input)
        FileOpen(3, "out.txt", OpenMode.Output)
        For fn = 1 To 2
            If fn = 2 Then PrintLine(3)
            Dim n As Short = LineInput(fn)
            For k = 1 To n
                Dim s = LineInput(fn)
                PrintLine(3, fxx(s))
            Next
        Next
        End
    End Sub
    Function fxx(ByVal s As String) As String
        fxx = ""
        Dim dat() = s.Split(",")
        Dim sum As Integer = 0
        Dim ace As Boolean = False
        For i = 0 To 2
            Dim pt As Integer = dat(i) Mod 13 + 1
            If pt > 10 Then pt = 10
            '  Print(3, i & ":" & pt & " ")
            sum += pt
            If pt = 1 Then ace = True
        Next
        If ace And sum <= 11 Then sum += 10
        If sum > 21 Then Return "Bom" Else Return sum
    End Function
End Class

1227-5_大數加乘(參考解)
大數相加或大數相乘:兩個正整數a,b中間一個+*,算出其結果,{0}<=a,b<1050
輸入範例:
in1.txt
3
12345+98765432123456789
56*89
7995979239752398752987925925225252*0
in2.txt
3
567+433
2147483648*7487812485248974848
0+0
輸出範例:
out.txt
98765432123469134
4984
0

1000
16079954871362414694843285504
0
輸出說明:




0印出一個0




0+0也是0
程式碼:
Public Class Form1
    Const MaxN As Integer = 50
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Hide()
        FileOpen(1, "in1.txt", OpenMode.Input)
        FileOpen(2, "in2.txt", OpenMode.Input)
        FileOpen(3, "out.txt", OpenMode.Output)
        For fn = 1 To 2
            If fn = 2 Then PrintLine(3)
            Dim n As Short = LineInput(fn)
            For k = 1 To n
                Dim s = LineInput(fn)
                PrintLine(3, fxx(s))
            Next
        Next
        End
    End Sub
    Sub s2n(ByVal xs As String, ByRef x() As Integer, ByRef xn As Integer)
        '將數字串 倒轉為 陣列
        xn = xs.Length
        Dim i, j As Integer
        For i = xn To 1 Step -1
            x(j) = Mid(xs, i, 1)
            j += 1
        Next
        cut0(x, xn)
    End Sub
    Sub cut0(ByRef x() As Integer, ByRef xn As Integer)
        Do While xn > 0 AndAlso x(xn - 1) = 0
            xn -= 1
        Loop
    End Sub
    Function fxx(ByVal s As String) As String
        fxx = ""
        Dim a(MaxN), b(MaxN), c(MaxN + MaxN) As Integer  '會清為零,若只宣告一次需記得清
        Dim an, bn, cn As Integer
        Dim p As Integer = InStr(s, "+")
        If p > 0 Then
            s2n(Mid(s, 1, p - 1), a, an)
            s2n(Mid(s, p + 1), b, bn)
            big_add(a, an, b, bn, c, cn)
        Else
            p = InStr(s, "*")
            s2n(Mid(s, 1, p - 1), a, an)
            s2n(Mid(s, p + 1), b, bn)
            big_mul(a, an, b, bn, c, cn)
        End If
        fxx = big_print(c, cn)
    End Function
    Sub big_add(ByVal x() As Integer, ByVal xn As Integer, ByVal y() As Integer, ByVal yn As Integer, ByRef z() As Integer, ByRef zn As Integer)
        ' PrintLine(3, big_print(x, xn) & " add " & big_print(y, yn))
        zn = Math.Max(xn, yn)
        For i = 0 To zn - 1
            z(i) = x(i) + y(i)
        Next
        For i = 0 To zn - 1
            If z(i) >= 10 Then
                z(i + 1) += 1
                z(i) -= 10
            End If
        Next
        If z(zn) <> 0 Then zn += 1
    End Sub
    Sub big_mul(ByVal x() As Integer, ByVal xn As Integer, ByVal y() As Integer, ByVal yn As Integer, ByRef z() As Integer, ByRef zn As Integer)
        '  PrintLine(3, big_print(x, xn) & " mul " & big_print(y, yn))
        zn = xn + yn
        For i = 0 To xn - 1
            For j = 0 To yn - 1
                z(i + j) += x(i) * y(j)
            Next
        Next
        For i = 0 To zn - 1
            If z(i) >= 10 Then
                z(i + 1) += z(i) \ 10
                z(i) = z(i) Mod 10
            End If
        Next
        cut0(z, zn)
    End Sub
  
    Function big_print(ByVal x() As Integer, ByVal xn As Integer) As String
        Dim bp As String = ""
        If xn = 0 Then Return "0"
        For i = xn - 1 To 0 Step -1
            bp &= x(i)
        Next
        Return bp
    End Function
End Class


Related Posts:

  • To Z2A 程式選訓 (1220,1227)1220,1227練習題及參考 1220撲克牌型 Dim card(4) As Integer '讀5張或分成5張 Dim pt(4) As Integer '點數 Dim fs(4) As Integer '花色 Private Sub Button2_Click(ByVal se… Read More
  • 資2忠 連連看教學版範例         指導:陳俊華 2018/12/12… Read More
  • To Z2A 程式選訓(2018-124) 資2忠程式選訓   寒輔進度 http://rs-vb.blogspot.tw/2017/04/z2ay7m3-7-17-4.html  去年的練習題(各年較簡單題型) http://rs-vb.blogspot.tw/2017/12/to-z2a.ht… Read More
  • To Z2A 程式選訓(2018-103,110) 20180103-1連寫數整除 給一個 正整數 p , 然後找一個最小的正整數n,數123…n串成的數字x使得 p 整除 x In1.txt 3 2 6 8 In2.txt 3 7 15 17 Out.txt 2 2 6 11 5 21… Read More
  • To Z2A 程式選訓(1227-4,1227-5)1227-4_撲克21點(參考解) 輸入範例: 【in1.txt】 3 0,2,6 13,10,11 27,36,23 【in2.txt】 3 26,42,8 11,25,30 39,21,22 輸出範例: 【out.txt】 21 21 Bom … Read More

0 意見:

張貼留言