顯示具有 Z2A 標籤的文章。 顯示所有文章
顯示具有 Z2A 標籤的文章。 顯示所有文章

2018年12月11日 星期二

2018年1月23日 星期二

To Z2A 程式選訓(2018-124)

資2忠程式選訓   寒輔進度

 去年的練習題(各年較簡單題型)




 12/20,12/27 的五題練習參考解(1)~(3)

      12/27 五題參考解 - (4) (5)

  1/3 的二題練習題目


以上的題目壓縮如下

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

12被2整除
12被6整除
123456可被8整除

1234567891011才能被7整除
12345可被15整除
123456789101112131415161718192021才被17整除

同餘  (a*b+c) Mod d = ( (a mod d) * b + c ) Mod d

20180103-2分數四則
輸入 a|b㊉c|d其中㊉是運算符號,可以是 + - * / 其中之一, a,b,c,d皆為不為負的整數,可能為0
   若b,d則輸出「除0錯誤」若運算為 / 且c為0亦輸出「除0錯誤」,運算結果若分子絕對值大於等於分母,輸出為帶分數型式(與分數部份空1格),若整除則不印分數部份,分數的部份化為最簡式,負號在最左方

In1.txt
3
3|2+5|4
2|3-14|4
2|3*6|4
In2.txt
3
2|3/4|5
5|3+7|0
4|5/0|2

Out.txt
2 3|4
-2 5|6
1

5|6
除0錯誤
除0錯誤
註:輸入與輸出的分子、分母間之直條 | 代表,與除號 / 有別
2與3|4之間空1格
負號在最左方
整除只印出整數部份





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


2017年12月28日 星期四

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 sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Randomize()
        Dim mk(51) As Boolean
        Dim cnt = 0
        Dim s As String = ""
        Do Until cnt = 5
            Dim x As Integer = Int(Rnd() * 52)
            If Not mk(x) Then
                mk(x) = True  '未出現過,可用
                card(cnt) = x
                cnt += 1
                s &= x & ","
            End If
        Loop
        Label1.Text = s
        Label1.Text &= "型別:" & chktyp()
    End Sub
 
  Function chktyp() As Integer '依 card()的值 判斷牌型
        For i = 0 To 4
            fs(i) = card(i) \ 13        ' 0~ 3 花色
            pt(i) = card(i) Mod 13 + 1  '1~13  點數
        Next i
        chktyp = 0 '非有型則為 散牌 0
        Dim flus As Boolean = True '同花?
        For i = 1 To 4
            If fs(i) <> fs(i - 1) Then '與前一張不同花色
                flus = False
                Exit For
            End If
        Next i
        Dim pairs(4) As Integer '同點對數 統計
        Array.Sort(pt, 0, 5) '點數 CDN 張排序 pt(0:cdn-1)
        Dim cnt As Integer = 1 '自己張數 1
        For i = 1 To 4
            If pt(i) = pt(i - 1) Then '與前一張同點,cnt+1
                cnt += 1
            Else
                pairs(cnt) += 1
                cnt = 1
            End If
        Next
        pairs(cnt) += 1
        '    MsgBox("同點" & pairs(2) & pairs(3) & pairs(4))



        ' 是否順子
        Dim stra As Boolean = chkstra() '順子?
        If Not stra And pt(0) = 1 Then
            pt(0) = 14
            Array.Sort(pt, 0, 5) '將ace改為 14 chk一次
            stra = chkstra()
        End If
        If flus And stra Then
            chktyp = 8 '同花順
        ElseIf pairs(4) = 1 Then
            chktyp = 7 '四條
        ElseIf pairs(3) = 1 And pairs(2) = 1 Then
            chktyp = 6 ' 葫蘆
        ElseIf flus Then
            chktyp = 5 '同花
        ElseIf stra Then
            chktyp = 4 '順
        ElseIf pairs(3) = 1 Then
            chktyp = 3 ' 三條
        ElseIf pairs(2) = 2 Then
            chktyp = 2 ' 兩對
        ElseIf pairs(2) = 1 Then
            chktyp = 1 ' 一對
        End If
        Return chktyp
    End Function
   
Function chkstra() As Boolean
        chkstra = True '順子?
        For i = 1 To 4
            If pt(i) - 1 <> pt(i - 1) Then '非前一張 點數+1
                Return False
            End If
        Next
    End Function

   

1227練習題目

[C_AR51-易] 螺旋矩陣
問題描述
螺旋矩陣是一個短陣,其中每個 cell 都填滿整數,且每個整數以螺旋的方式排列。下圖為二個 size = 8 的螺旋矩陣。觀查圖 (a) ,數字由 1 開始,以逆時鐘的方向,螺旋狀地往中心排列。而圖 (b) 則是一個順時鐘的螺旋矩陣,和圖 (a) 不一樣之處在於其數字的旋轉方向為順時鐘旋轉。



請寫一個程式,接受輸入,並將螺旋矩陣印出。
輸入說明:
輸入為一行字串,包含了兩個數值,每個數值以逗點隔開。
第一個數值為 size ,其值介於 1 到 30 間( i.e., 1 <= size <= 30 )。
第二個數值為方向, 1 為順時鐘方向, 2 為逆時鐘方向。
輸出說明:
將螺旋矩陣輸出。每個數字的寬度為 3 ,不足寬度之處補 0 (也就是說,數字 1 要印輸出成 001 ,數字 12 要輸出成 012 …依此類推)。每個數字後要加一個逗點,數字間不要有空白。每一 row 的最後一個數字之後不要加逗點。
輸入範例:
7,1
輸出範例
001,002,003,004,005,006,007
024,025,026,027,028,029,008
023,040,041,042,043,030,009
022,039,048,049,044,031,010
021,038,047,046,045,032,011
020,037,036,035,034,033,012
019,018,017,016,015,014,013

撲克牌型,給5張牌(0~51),判斷其牌型印出
輸入範例:
0,9,10,11,12
2,15,41,28,1
4,2,1,0,3
2,15,41,4,30
2,6,7,4,3
1,29,43,0,15
3,29,16,15,1
34,35,1,21,14
20,7,8,9,10
15,7,9,10,8
輸出範例:
同花大順
四條
同花順
葫蘆
同花
順子
三條
兩對
一對
散牌

計算地雷數:踩地雷計算九宮地雷數
第1列輸入m , n 及b 代表有 m*n 個格子,有b個地雷,接著第2列有b個座標,左上角(0,0)列先
以下圖左為例,計算每一格四周九宮位位置有幾個地雷,地雷處不用算,計算結果如下圖右
   
      
輸入範例:
11,10,11
2,1 2,3 2,5 3,6 4,8 6,4 7,8 9,1 9,9, 10,6 10,9

輸出範例:
0 0 0 0 0 0 0 0 0 0
1 1 2 1 2 1 1 0 0 0
1 * 2 * 2 * 2 1 0 0
1 1 2 1 2 2 * 2 1 1
0 0 0 0 0 1 1 2 * 1
0 0 0 1 1 1 0 1 1 1
0 0 0 1 * 1 0 1 1 1
0 0 0 1 1 1 0 1 * 1
1 1 1 0 0 0 0 1 2 2
1 * 1 0 0 1 1 1 2 *
1 1 1 0 0 1 * 1 2 *

撲克21點,給3張牌(0~51),判斷幾點,>21 爆,{A可當1或11、JQK皆10點}
輸入範例:
0,2,6
13,10,11
26,42,8
11,25,30
輸出範例:
21
21
14
Bom


大數相加或大數相乘:兩個正整數a,b中間一個+或*,算出其結果,1<=a,b<1050
輸入範例:
12345+98765432123456789
56*89
567+433
2147483648*7487812485248974848
輸出範例:
98765432123469134
4984
1000
16079954871362414694843285504



1227-1螺旋矩陣及1227-3數地雷

1227-1 螺蜁矩陣
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) '兩 in檔間 空一列
            Dim x As Integer = LineInput(fn) '有 x 筆輸入,每筆兩個數字
            For k = 1 To x
                Dim s = LineInput(fn)  ' n,d 大小及方向
                PrintLine(3, fxx(s)) '每個輸出後空一列
            Next
        Next
    End Sub
    Function fxx(ByVal s As String) As String
        Dim dat() = s.Split(",")
        Dim N As Integer = dat(0), d As Integer = dat(1)
        Dim n2 As Integer = N * N   'N^2
        d -= 1 '順1 ->0從右開始 ,逆2 ->1從下開始
        Dim m As Integer = 1 'd轉 +1 或+3
        If d = 1 Then m = 3
        fxx = ""
        Dim a(30, 30) As Integer
        '       d :0右 1下 2左 3上
        Dim dr() = {0, 1, 0, -1}
        Dim dc() = {1, 0, -1, 0}
        Dim r As Integer = 0, c As Integer = 0  ' (r,c)=(0,0) 左上開始
        Dim p = 1 '從1開始填
        Do While (p <= n2)
            a(r, c) = p
            Dim nr = r + dr(d), nc = c + dc(d)
            If ((nr < 0 Or nr >= N Or nc < 0 Or nc >= N) OrElse a(nr, nc) <> 0) Then '轉向
                d = (d + m) Mod 4
                nr = r + dr(d) : nc = c + dc(d)
            End If
            r = nr : c = nc : p += 1
        Loop
        ' 輸出
        For r = 0 To N - 1
            fxx &= setw(3, "0", a(r, 0))
            For c = 1 To N - 1
                fxx &= "," & setw(3, "0", a(r, c))
            Next
            fxx &= vbNewLine
        Next
    End Function
    Function setw(ByVal w As Integer, ByVal fill As Char, ByVal v As Integer) As String
        setw = ""
        For i = 1 To w
            If v = 0 Then
                setw = fill & setw
            Else
                setw = (v Mod 10) & setw
                v \= 10
            End If
        Next
    End Function
1227-3 數地雷
  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) '兩 in檔間 空一列
            Dim x As Integer = LineInput(fn) '有 x 筆輸入,每筆兩個數字
            For k = 1 To x
                Dim mnb() = LineInput(fn).Split(",")  ' m,n,b 列*行,雷數
                m = mnb(0) : n = mnb(1) : b = mnb(2)
                Dim s = LineInput(fn) '讀入座標
                PrintLine(3, fxx(s)) '每個輸出後空一列
            Next
        Next
        End
    End Sub
    'in1.txt 更正
    '11,10,11
    '2,1 2,3 2,5 3,6 4,8 6,4 7,8 9,1 9,9, 10,6 10,9
    Dim m, n, b As Integer
    Function fxx(ByVal s As String) As String
        Dim a(m + 1, n + 1) As Integer '外圍多一圈
        Dim dat() = s.Split(" ")
        Dim r, c As Integer
        For i = 0 To UBound(dat)  '讀地雷座標,設為 -1
            Dim rc() = dat(i).Split(",")
            r = rc(0) : c = rc(1)  '座標 (r,c)
            a(r + 1, c + 1) = -1 '改為從 (1,1)開始,往右下移1格
        Next
        fxx = ""
        For r = 1 To m
            For c = 1 To n
                Dim cnt As Integer = 0 '四周九宮雷數
                If a(r, c) = -1 Then
                    fxx &= "* "
                    Continue For '這格是地雷,不用計算
                End If
                If a(r - 1, c - 1) = -1 Then cnt += 1 '左上
                If a(r - 1, c) = -1 Then cnt += 1 '上
                If a(r - 1, c + 1) = -1 Then cnt += 1 '右上
                If a(r, c - 1) = -1 Then cnt += 1 '左
                If a(r, c + 1) = -1 Then cnt += 1 '右
                If a(r + 1, c - 1) = -1 Then cnt += 1 '左下
                If a(r + 1, c) = -1 Then cnt += 1 '下
                If a(r + 1, c + 1) = -1 Then cnt += 1 '右下
                a(r, c) = cnt  '放入算出的個數
                fxx &= cnt & " "
            Next
            fxx &= vbNewLine
        Next
    End Function