2019年1月5日 星期六

Z2B實作

Fo2實作試題說明:
專案名稱:Z2B56-For2                                    電腦崗位:
一、表單佈建:
1表單大小:600,500       
2表單標題:「資2孝56陳俊華-迴圈2實作」
3三個文字方塊:位置為(80,60),(180,60),(280,60),字型皆(新細明體,12)
               寬度皆設為60,文字顯示分別  2, 15 , 3
4五個按鈕:位置為(25,350),(125,350) ,(225,350) ,(325,350) ,(425,350),字型皆(標楷體,13)
               大小皆設為(85,45),文字顯示分別 「產生1」「產生2」「產生3」「消除」「填數」
               背景色為 Gold、 字顏色皆 Blue
二、程式規定:每個功能6%
 0、表單一載入:將按鈕4、5設為不啟動
 1、按按1:(1)輸入文字方塊1~3分別為A,B,C
              (2)以For迴圈產生k= A To B Step C 共 N 個 標籤控制項陣列,但N最多12個
              (3)標籤的大小皆(30,40),位置為(35,150),(70,150),(105,150)...
              (4)標籤皆有框線,背景色顏色為 RGB 亂數產生
              (5)字型皆為("微軟正黑", 10)、文字顯示 k
              (6)然後將按鈕1~3設為不啟動,將按鈕4、5設為啟動
 2、按按2:(1)輸入文字方塊1~3分別為A,B,C
              (2)以For迴圈產生k= A To B Step C 共 N 個 標籤控制項陣列,但N最多10個
              (3)標籤的大小皆(30,25),位置為(385,30),(385,60),(385,90)...
              (4)標籤皆有框線,背景色顏色為 RGB 亂數產生
              (5)字型皆為("微軟正黑", 10)、文字顯示 k
              (6)然後將按鈕1~3設為不啟動,將按鈕4、5設為啟動
 3、按按3:(1)以雙重For迴圈產生2列各6個標籤控制項
              (2)標籤的大小皆(30,40),第1列位置為(35,130),(70,130),(105,130)...
                                  ,第2列位置為(35,180),(70,180),(105,180)...
              (3)標籤皆有框線,背景色顏色為 RGB 亂數產生
              (4)字型皆為("微軟正黑", 10)、文字顯示 k
              (5)然後將按鈕1~3設為不啟動,將按鈕4、5設為啟動
 4、按紐4:將產生的控制項陣列取消
 5、按鈕5:(1)輸入文字方塊1~3分別為A,B,C
              (2)將標籤的前 A 個的顯示文字修改如下,但A最多N個
                  k=1 To A,若k為偶數則顯示文字改為 k*B mod 100
                      若k為奇數則顯示文字改為 k+C

 
For2 參考程式碼:
Public Class Form1
    Dim N As Integer = 12 '控制項個數,最多12個
    Dim N2 As Integer = 10 '控制項個數,最多10個
    Const wd As Integer = 30 '寬
    Const ht As Integer = 40 '高
    Const ht2 As Integer = 25 '高
    Const gt As Integer = 5 '間距
    Const VPOS As Integer = 150 ' y 軸位置
    Const HPOS As Integer = 385 ' x 軸位置
    Dim LB(N) As Label
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Button4.Enabled = False
        Button5.Enabled = False
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim A As Integer = TextBox1.Text
        Dim B As Integer = TextBox2.Text
        Dim C As Integer = TextBox3.Text
        Dim k As Integer = 0 '個數
        Dim sum As Integer = 0 '和
        For i = A To B Step C
            Dim cr As Integer = Int(Rnd() * 256) '紅色的度數 0~255隨機
            Dim cg As Integer = Int(Rnd() * 256) '綠色的度數 0~255隨機
            Dim cb As Integer = Int(Rnd() * 256) '藍色的度數 0~255隨機
            If k >= N Then Exit For
            k += 1 '個數加1
            LB(k) = New Label
            Me.Controls.Add(LB(k))
            With LB(k)
                .Location = New Point(k * (wd + gt), VPOS) '標籤的位置
                .Width = wd '標籤的寬度
                .Height = ht '標籤的高度

                .BorderStyle = BorderStyle.FixedSingle '標籤加框線
                .Font = New Font("微軟正黑", 10)
                .Text = i '標籤顯示的文字
                .BackColor = Color.FromArgb(cr, cg, cb) '背景色:隨機的 紅、綠、藍
            End With
        Next
        N = k
        Button1.Enabled = False
        Button2.Enabled = False
        Button3.Enabled = False
        Button4.Enabled = True
        Button5.Enabled = True
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim A As Integer = TextBox1.Text
        Dim B As Integer = TextBox2.Text
        Dim C As Integer = TextBox3.Text
        Dim k As Integer = 0 '個數
        Dim sum As Integer = 0 '和
        For i = A To B Step C
            Dim cr As Integer = Int(Rnd() * 256) '紅色的度數 0~255隨機
            Dim cg As Integer = Int(Rnd() * 256) '綠色的度數 0~255隨機
            Dim cb As Integer = Int(Rnd() * 256) '藍色的度數 0~255隨機
            If k >= 10 Then Exit For
            k += 1 '個數加1

            LB(k) = New Label
            Me.Controls.Add(LB(k))
            With LB(k)

                .Location = New Point(HPOS, k * (ht2 + gt)) '標籤的位置
                .Width = wd '標籤的寬度
                .Height = ht2 '標籤的高度

                .BorderStyle = BorderStyle.FixedSingle '標籤加框線
                .Font = New Font("微軟正黑", 10)
                .Text = i '標籤顯示的文字
                .BackColor = Color.FromArgb(cr, cg, cb) '背景色:隨機的 紅、綠、藍
            End With
        Next
        N = k
        Button1.Enabled = False
        Button2.Enabled = False
        Button3.Enabled = False
        Button4.Enabled = True
        Button5.Enabled = True
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim A As Integer = TextBox1.Text
        Dim B As Integer = TextBox2.Text
        Dim C As Integer = TextBox3.Text
        Dim k As Integer = 0 '個數
        Dim sum As Integer = 0 '和
        For i = 1 To 2
            For j = 1 To 6
                Dim cr As Integer = Int(Rnd() * 256) '紅色的度數 0~255隨機
                Dim cg As Integer = Int(Rnd() * 256) '綠色的度數 0~255隨機
                Dim cb As Integer = Int(Rnd() * 256) '藍色的度數 0~255隨機
                If k >= 12 Then Exit For
                k += 1 '個數加1

                LB(k) = New Label
                Me.Controls.Add(LB(k))
                With LB(k)
                    .Location = New Point(j * (wd + gt), 80 + i * 50) '標籤的位置
                    .Width = wd '標籤的寬度
                    .Height = ht '標籤的高度

                    .BorderStyle = BorderStyle.FixedSingle '標籤加框線
                    .Font = New Font("微軟正黑", 10)
                    .Text = k  'i & "," & j '標籤顯示的文字
                    .BackColor = Color.FromArgb(cr, cg, cb) '背景色:隨機的 紅、綠、藍
                End With
            Next
        Next
        N = k
        Button1.Enabled = False
        Button2.Enabled = False
        Button3.Enabled = False
        Button4.Enabled = True
        Button5.Enabled = True
    End Sub
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Dim cnt = Me.Controls.Count - 1
        For i = cnt To cnt - N + 1 Step -1
            Me.Controls.RemoveAt(i)
        Next
        Button1.Enabled = True
        Button2.Enabled = True
        Button3.Enabled = True
        Button4.Enabled = False
        Button5.Enabled = False
        N = 12
    End Sub

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        Dim A As Integer = TextBox1.Text
        Dim B As Integer = TextBox2.Text
        Dim C As Integer = TextBox3.Text
        If A > N Then A = N
        For k = 1 To A
            If k Mod 2 = 0 Then
                LB(k).Text = k * B Mod 100
            Else
                LB(k).Text = k + C
            End If
        Next
    End Sub


End Class

終極密碼X試題說明

二信高中 107上 資2孝程式 模考 x卷           電腦崗位:


○、專案名稱:(5%) Z2B56-模考X-終極密碼

一、表單佈建:(55%)除了標題,每項未達成 扣3分{班號、崗位沒寫也扣}
 1.表單大小:550 x 450    表單背景圖: 「A.jpg」、   不定比例 隨框縮放
 2.表單標題:「資2孝56號陳俊華-模考X卷-終極密碼」  5%
 3.二個標籤:Label1標題:「電腦或人工設定密碼(11~90):」微軟正黑、14點大小、背景色LimeGreen
        Label2標題:「結果:」400x60字水平置中,微軟正黑、14點大小、字白色、背景色Blue
 4.文字方塊:TextBox1,清空,設為密碼型式*號,字紅色、字大小15
 5.按鈕2個:Button1標題:「猜一猜」標楷16點大小、粗斜體、字顏色Gold、背景色Purple
Button2標題:「重設密碼」標楷16點大小、粗斜體、字顏色Gold、背景色Purple

二、程式規定:(40%)每一項未完成扣 5~ 10分
1.表單一載入:產生一隨機亂數 11~90之間,存入公用變數 {pass}
2.按鈕1被按一下:
(1)若文字方塊有輸入會以Msgbox詢問「電腦Y 或人工N」,回答N則以TextBox1中的輸入為密碼
訊息窗的圖示為問號,按鈕只有「是」「否」
{ 但若輸入的密碼不是 11~90則仍以電腦產生的密碼 }
(2)接著以輸入窗顯示「猜11~90」等待輸入,並每次會將變數的 {次數} 加1
若輸入正確則在Label2上顯示「答對了!正確數字為 {pass} 。你共猜了 {次數} 次。
{pass}
是正確的密碼,{次數}是猜了幾次才猜到。
(3)若輸入的{數字}為 -56 則以訊息窗顯示「密碼是:{pass}俊華再見!」,然後結束程式。
         
↑自己座號                     ↑ {pass}是正確密碼,俊華是自己姓名
  
若輸入 0 可停止猜測 以 Exit Sub 退出副程式
  
若輸入的{數字}大於{pass}則輸入窗的訊息會顯示「{數字}  太大了,再猜:{上次左界}~ {數字}」
  
若輸入的{數字}小於{pass}則輸入窗的訊息會顯示「{數字}  太小了,再猜:{數字}~{上次左界}」
3.按鈕2被按一下:將猜測的次數歸零,猜測的範圍改回11~99,{pass}值重新產生

終極密碼x 參考程式碼:
Public Class Form1

    Dim Lt As Integer = 11  '左界
    Dim Rt As Integer = 90 '右界
    Dim pass As Integer  ' 密碼
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Call setpass()
    End Sub
   
 Sub setpass()
       Lt = 11 '*更正* 應先設定 LT及RT 再 執行 int(rnd ... )
       Rt = 90
       Randomize()
        pass = Int(Rnd() * (Rt - Lt + 1)) + Lt '自動產生密碼
        TextBox1.Text = ""  '將輸入密碼區清空
   End Sub

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' 判斷是否 人工設密碼 或 電腦產生
        If TextBox1.Text <> "" Then
            Dim r = MsgBox("電腦Y 或人工N", vbQuestion + MsgBoxStyle.YesNo)
            If r = vbNo Then
                If Val(TextBox1.Text) >= 10 And Val(TextBox1.Text) <= 99 Then
                    pass = Val(TextBox1.Text)
                End If
            Else
                Call setpass()
            End If
        End If
        ' 開始猜
        Dim gs As Integer = InputBox("猜11~90") '您所 猜的數
        Dim n As Integer = 1 '猜的次數
        Do While gs <> pass
            ' 若輸入 -56(自己座號) 放棄,顯示密碼並結束程式
            If gs = -56 Then
                MsgBox("密碼是:" & pass & "再見!")
                End
            End If
            If gs = 0 Then
                Exit Sub
            End If
            ' 若輸入 太大,則 右界數字改為 輸入的數字
            If gs > pass Then
                Rt = gs
                gs = InputBox(gs & " 太大了,再猜:" & Lt & "~" & Rt)
            Else   ' 若輸入 太小,則 左界數字改為 輸入的數字
                Lt = gs
                gs = InputBox(gs & " 太小了,再猜:" & Lt & "~" & Rt)
            End If
            n += 1
        Loop
        Label2.Text = "答對了!正確數字為 " & pass & " 。你共猜了 " & n & " 次。"
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Call setpass()
    End Sub

End Class








2018年12月24日 星期一

2018年12月19日 星期三

篩法、陣列的應用

篩法400.xlsx


找 2~n(<10^7)的所有質數 虛擬碼
動態陣列 p 、靜態陣列 c(n) 初值 false設為質數、true被刪記(非質數)
push (2)
for i= 3 ~ n jump 2
  if not c(i) then
     '//這是質數,將所有 i 的倍數刪掉
     push( i ) '將 i 加入 p 陣列
     for j=i*i ~ n jump i
         c(j) = true ' j 被刪記
     end for
  end if
end for

應用題連結

1220-0 ~ 1220-3 參考解

2018年12月15日 星期六

商競程式107正式題

讀檔部份省略,假設每組一列S或多列S()傳入fxx,傳回結果

F107_P11_計算含S字數
  Function fnxx(ByVal s As String) As String
  fnxx = ""
  s = Trim(s) : ttrim(s, "  ", " ")
  Dim dat() = s.Split(" ")
  Dim cnt = 0
  For i = 0 To UBound(dat)
   If InStr(dat(i), "s") > 0 Or InStr(dat(i), "S") > 0 Then cnt += 1
  Next
  Return dat.Length & "," & cnt
  End Function
    '若資料以空格隔開,可能需要將多個空白 取代為 單空白
    Sub ttrim(ByRef s As String, ByVal a As String, ByVal b As String)
        While (InStr(s, a) > 0)
            s = s.Replace(a, b)
        End While
    End Sub

' 107年 正式題 P12 井字棋
' 不會有兩人同時連線,分別判斷1及2有沒有連、否則都沒連3
' 一次傳S陣列 3列

    Dim a(2, 2) As Integer
    Function fxx(ByVal s$()) As String
        fxx = "3"
        For i = 0 To 2
            For j = 0 To 2
                a(i, j) = Mid(s(i), j + 1, 1)
            Next
        Next
        If chk(1) Then Return 1
        If chk(2) Then Return 2
    End Function
    Function chk(ByVal p As Integer) As Boolean
        ' 列
        Dim cnt As Integer
        For i = 0 To 2
            cnt = 0
            For j = 0 To 2
                If a(i, j) = p Then cnt += 1
            Next
            If cnt = 3 Then Return True
        Next
        ' 行
        For i = 0 To 2
            cnt = 0
            For j = 0 To 2
                If a(j, i) = p Then cnt += 1
            Next
            If cnt = 3 Then Return True
        Next
        If p = a(0, 0) AndAlso a(0, 0) = a(1, 1) AndAlso a(1, 1) = a(2, 2) Then Return True '\
        If p = a(0, 2) AndAlso a(0, 2) = a(1, 1) AndAlso a(1, 1) = a(2, 0) Then Return True '/
        Return False
    End Function

' 107年 正式題 P21 快樂數字
' 最大 100000 宣告一陣列,檢查是否出現過

    Const MaxN As Integer = 100000 '最大的數字

    Function fxx(ByVal s$) As String
        fxx = ""
        Dim x% = s
        Dim mk(MaxN) As Boolean
        mk(x) = True
        Do Until x = 1
            x = ss(x)
            If mk(x) Then Exit Do
            mk(x) = True
        Loop
        If x = 1 Then Return "T" Else Return "F"
    End Function
 
Function ss(ByVal x As Integer) As Integer
        ss = 0
        Dim d%
        Do Until x = 0
            d = x Mod 10
            ss += (d * d)
            x \= 10
        Loop
    End Function

' 107年 正式題 P22 排列
' 最多5個數字,全排列,由小至大問第 k 個的值

    Dim plst As New ArrayList

   Function fxx(ByVal s$) As String
        fxx = ""
        Dim dat() = s.Split(",")
         Dim N% = dat(0)
        Dim a(N - 1) As Integer '最多 5 個數
        For i = 0 To N - 1
            a(i) = dat(i + 1)
        Next
        Dim k% = dat(N + 1)
        plst.Clear()
        perm(a, 0, N)
        plst.Sort()
        Return plst(k - 1)

    End Function

 Sub perm(ByVal a%(), ByVal p%, ByVal N%)
     If p = N Then  '產生一組
        Dim num = ""
        For i = 0 To N - 1
            num &= a(i)
        Next
        plst.Add(num)
        Return
    End If
    ' 換 p ~ N-1 , 遞迴
    Dim t As Integer
    For x = p To N - 1
      t = a(p) : a(p) = a(x) : a(x) = t  ' p換 成其它的數字
      perm(a, p + 1, N)
      t = a(p) : a(p) = a(x) : a(x) = t  ' p 換回來
    Next
  End Sub

' 107年 正式題 P31 大數乘冪運算 M^K { 1 <= M,K <= 999 }
' 可 用 BigInteger 類別,應也可以使用 Log10吧
' 專案 需加入 參考,再 Imports,   不確定BigInteger的位數上限,需另查

Imports System.numerics

 Function fxx(ByVal s As String) As String
        Dim dat() = s.Split(",")
        Dim m% = dat(0), k% = dat(1)
        ' 算 m^k
        Dim Pow As BigInteger = BigInteger.Pow(m, k)
        fxx = Len(Pow.ToString) '& "," & Pow.ToString
   End Function

方法2   使用Log10: Return Math.Floor(Math.Log10(M)*K)+1

' 107年 正式題 P32 模數
' 應該有公式解(數論?待查)  但  a,b,m皆 1~99 : 99^3 應可以暴力解

    Function fxx(ByVal s$) As String
        fxx = ""
        s = Strings.Trim(s) : ttrim(s, "  ", " ")
        Dim dat() = s.Split(" ")
        '    fxx = s & "," & dat.Length
        Dim ai% = dat(0), ax% = dat(1)
        Dim bi% = dat(2), bx% = dat(3)
        Dim mi% = dat(4), mx% = dat(5)
        Dim cnt = 0
        For k = mi To mx
          Dim md = k * 100
          For i = ai To ax
            For j = bi To bx
               If (i + j) Mod k = (i - j + md) Mod k Then cnt += 1
            Next
          Next
        Next
        Return cnt
    End Function

    Sub ttrim(ByRef s$, ByVal a$, ByVal b$)
        Do While InStr(s, a) > 0
            s = s.Replace(a, b)
        Loop
    End Sub

' 107年 正式題 P41 樹最遠的2節點長度
' 因最多 127個節點,父子為相鄰,建adj(,) 以 floyd找任2點最短路{樹沒迴路,
  2點只有一種距離}, 所有2節點距中最長即是

    Const MaxN% = 127
    Const inf% = 99
    Dim a(MaxN, MaxN) As Integer

    Function fxx(ByVal s$) As String
        s = Mid(s, 2)
        Dim bt(MaxN) As Boolean
        Dim sep() As Char = {",", ","}
        Dim dat() = s.Split(sep)
        Dim m% = dat.Length '最後 node
        Dim p%, v%
        For k = 0 To UBound(dat)
            v% = Val(dat(k))
            If v% > 0 Then bt(k + 1) = True Else bt(k + 1) = False
        Next
        For i = 1 To m
            For j = 1 To m
                a(i, j) = inf 'inf
            Next
        Next
        '建相鄰矩陣
        For p = m \ 2 To 1 Step -1
            Dim lch% = p * 2 '左子
            Dim rch% = lch% + 1 ' 右子
            If bt(lch) Then '有左子 連
                a(p, lch) = 1 : a(lch, p) = 1
            End If
            If bt(rch) Then '有右子 連
                a(p, rch) = 1 : a(rch, p) = 1
            End If
        Next
        floyd(m)  '最短路 {樹沒有迴圈,兩點距只有一個值}
        v = 0
        For i = 1 To m
            For j = i + 1 To m
                If a(i, j) < inf Then
                    v = Math.Max(v, a(i, j))
                End If
            Next
        Next
        fxx = v
    End Function

  Sub floyd(ByVal m%)
        For k = 1 To m
            For i = 1 To m
                For j = 1 To m
                    a(i, j) = Math.Min(a(i, j), a(i, k) + a(k, j))
                Next
            Next
        Next
    End Sub

' 107年 正式題 P42 循環排列
' 因最多 k=20 , 數字 1~k 找循環


    Const MaxN% = 20 '最多20個 1~20
    Dim a(MaxN) As Integer
    Dim vst(MaxN) As Boolean
    Dim cyc As New ArrayList
   
Function fxx(ByVal s$) As String
        s = Mid(s, 2)
        Dim sep() As Char = {",", ","}
        Dim dat() = s.Split(sep)
        Dim k% = dat.Length 'k個數
        Dim v%
        fxx = ""
        For i = 1 To k
            v% = Val(dat(i - 1))
            a(i) = v ' 第 i 個 接 第 v 個
        Next
        fxx &= "["
        Dim fst As Boolean = True
        Array.Clear(vst, 0, vst.Length)
        For i = 1 To k
            If vst(i) Then Continue For
            If fst Then fst = False Else fxx &= ","
            fxx &= "["
            If a(i) = i Then
                fxx &= i     '自己接自己
            Else
                cyc.Clear()
                dfs(i)
                fxx &= cyc(0)
                For j = 1 To cyc.Count - 1
                    fxx &= "," & cyc(j)
                Next
            End If
            fxx &= "]"
        Next
        fxx &= "]"
    End Function

    Sub dfs(ByVal u%)
        If vst(u) Then Return
        cyc.Add(u) : vst(u) = True
        dfs(a(u))
    End Sub








2018年12月11日 星期二

2018年12月4日 星期二

107模(二信自訂)

二信高中自訂107模擬題  (題目文字檔) (測資檔)  


M107a_p01 春夏秋冬
阿華和阿俊玩一個遊戲叫做「春夏秋冬」有四種牌,夏吃春、秋吃夏、冬吃秋、春吃冬,吃到的得1分,其餘不計分
我們以 PMAW分別代表春夏秋冬,阿華和阿俊各發六張牌,阿華的a1~a6、阿俊的b1~b6
a1與b1比、a2與b2比…a6與b6比,問阿華與阿俊各得幾分?
in1.txt
3  
AMPWAP MWWPMW
PPMMWA MWAAPW
WMAWPM AWMPWW
in2.txt
3
AMWPWP WMWPMW
PAPMMW AMWAAP
PWMAWP MAWMPW

out.txt
4 1
1 5
3 1

1 1
2 3
3 2

參考解1

M107a_p02 小三數學
每列2個數字,第1個數字k:10~2147483647,第2個數字m:-2147483648~2147483647,
若k的每位數之間可插入1或2個運算符號使結果等於 m ,則輸出YES,否則輸出NO
可插入的符號為{ + , - , * , / }四種}可使用相同的符號,先乘除或加減
假設計算過程,除法需整除才算, 例如 9/6*4=6 不算,因9/6非整數不可以先*4再/6
in1.txt
5  
123 4
234 14
24015 16
862 4
22 4
in2.txt
3
1357924680 -626963
334 5
543 345
out.txt
YES
YES
YES
YES
YES

YES
YES
NO

-------輸出註解
12/3
2+3*4
240/15
8-6+2
2+2 或 2*2

1357-924*680
3*3-4 或 3/3+4
NO

參考解2

M107a_p03 組合排列
有一個m位數數字X,最少3位,不含0不重複,選n個{2~m},所有的組合全排列後,由小至大的第k個是多少
若m=4,x=1357,n=3,則全排列為
(1) 135 (2) 137 (3) 153 (4) 157 (5) 173 (6) 175 (7) 315 (8) 317 (9) 351 (10)357 (11)371 (12)375
(13)513 (14)517 (15)531 (16)537 (17)571 (18)573 (19)713 (20)715 (21)731 (22)735 (23)751 (24)753
輸入每列三個數 x,n,k、輸出全排列的第k個數,如上例x=1357,n=3,k=10則輸出357
in1.txt
2
1357,3,10
1357,3,19
in2.txt
3
543,2,3
123,2,5
2468,3,11
out.txt
357
713

43
31
482

參考解3


M107a_p04 十轉五四三
每列2個數 x,k,其中x為十進位 0<x<1000000,且有可能有小數,若有小數最多3位數;k為3,4,5之一,代表k進位
請將x轉為 k進位,若沒有小數則不印,若有小數最多3位,小數部份的尾0不印

in1.txt
3  
123.456 5
2345.678 4
345678 3
in2.txt
3
987654.321 3
87653.125 4
6789 5
out.txt
443.212
210221.223
122120011220

1212011210210.022
111121211.02
204124

參考解4


M107a_P05朋友(高中104北二區-3.b839)

問題描述:當我們到一個新環境時,常常會從和我們有相同個性、喜好或來自相同故鄉的人們開始結交,
我們也會對同姓交或名字相近的人感到熟悉或有好感。 在這道題目中,我們將假設朋友關係是這樣建立的:
(1)若兩個人的名字相似,則兩個人會結為朋友。
(2)若兩個人有共同朋友,則兩個人會結為朋友。
如何定義兩個人的名字相似呢?令兩個人的名字為 S 和 T ,我們說若S(長度為m)和T(長度為n)的
最長共同子字串(Longest common subsequene,LCS)長度不小於min(m,n)/2.0,則S和T相似。  {LCS的定義就省略}
根據上上述的朋友關係,我們可以將一群人分成一個或數個團體,每個團體中的任意兩個人都是朋友,而兩個不同團體中的人則都不是朋友。
現在,請你寫一個程式,輸出最大團體(人數最多)的人數個數。
輸入每列第1個數字k代表一群人共有k個人(最多20人),接著有這k人的姓名{皆是小寫字母最多20字},以空白隔開
in1.txt
3
5 abc adb xyzzzz zzzxop xompn
5 abc adb xyzzzz zzzxop xoapd
5 abc adb xyzzzz zzzxop xoape

in2.txt
3
6 abcd adb xyzzzz zzzxop xompn zzzab
6 abc adx xyzzzz zzzxop xoapd xyzaa
6 abdc adb xyzzzz zzzxop xoape xyzz

out.txt
3
5
3

6
5
4


M107a_p06霍夫曼編碼
一篇英數字的文章,若每個字元不壓縮最少一個字元需7位元,用霍夫曼編碼,較常用的字元使用較少的位元編碼,
可以使整個使用的位元數減少。例如「ABCABDABEACDABE」共15個字原使用7位元*15共105個位元,若將編碼改為
A00,B01,C10,D110,E1110,F1111,則只需使用36個位元即可。
每列皆為可列印的ASCII字元,最多100個字元,使用霍夫曼編碼,請問最少可用多少位元表示這列文字?
in1.txt
3
ABCABDABEACDABE
This is a Book.
TO BE OR NOT TO BE?

in2.txt
2
In computer science and information theory, a Huffman code is a particular type of optimal code
CAD,CAI,CAM,CIM,DOG,GOD,ACM,CAT,CAE,CAR,BOOK,DOOR.

out.txt
34
48
53

389
168



 M107a_p07最少硬幣數
阿華商店使用阿華幣,其幣值是特定的,給一個正整數問換成最少阿華幣的個數?
例如有6種幣值:{1,2,3,5,15,18}要換48元可以是 18+18+5+5+2要五個硬幣,也可以 18+15+15要三個硬幣
每列給第1個數字k{5~12}代表有k種幣值,接著k個幣值,最後m代表要換m元(1~9999},輸出最小硬幣數
in1.txt
3
6,1,2,3,5,15,18,48
7,1,3,5,8,12,20,35,100
7,1,3,5,8,12,20,35,123

in2.txt
3
10,1,2,3,10,15,20,25,30,55,88,234
12,1,2,5,8,13,25,40,60,99,123,250,511,9876
8,1,5,12,20,25,35,85,100,466

out.txt
3
5
6

4
22
7


M107a_p08最短路徑長
第1列為圖形各邊的資訊{2節點名及邊長},節點編碼皆為1個大寫字母,邊長1~99,各邊以逗號隔開
第2列有數組詢問,以逗號隔開,每個詢問給兩節點名稱,問這兩節點之最短路徑的長度,輸出亦以逗號隔開
in1.txt
2
AB11,BC12,CD17,DE13,EA6,AF5,FB9,FD8,EF15,FG1,BG3
EB,CE
RN15,AB9,DR14,AE2,BE4,BF16,CF23,HR25,FG13,GH5,AJ17,JK7,FK12,EJ22,AS8,SM18,SP14,LG6,LF21,GM27,MN11,JL20,PN38
AN,BS,LC

in2.txt
2
AB11,BC12,CD7,DE23,EA6,AF5,FB9,CF13,FD8,EF15
ED,CE
RN15,AB9,BC39,CD41,DR53,AE2,BE4,BF16,CF23,CH43,HR25,FG13,GH5,AJ17,JK7,FK12,EJ22,AS8,SM18,SP14,LG6,LF21,GM27,MN11,JL20,PN38
AN,BS,LC


out.txt
15,27
37,14,42

19,24
37,14,42



M107a_p09最長遞增子序列(LIS)
 給一串整數數列a1,a2,....am {m最大100} ,從中任選k個b1,b2,...bk使b1<b2<...<bk,
  例: bj的順序仍維持ai的順序, 問最大的k為多少?
例:輸入為6,2,9,8,3,7,10,4,5
   可以6,9,10、或6,8,10、 6,7,10、 2,7,9、 … 也可以 2,3,4,5 :最長數列為 4個
  輸入為6,2,9,8,3,10,7,4,13,5
   可以6,9,10,13、… 也可以2,3,4,5  :最長數列為 4個
 輸入為6,2,9,8,3,10,7,4,13,5,11
   可以 6,8,10,13、 也可以 2,3,4,5,11  :最長數列為 5個
in1.txt
3
6,2,9,8,3,7,10,4,5
6,2,9,8,3,10,7,4,13,5
6,2,9,8,3,10,7,4,13,5,11

in2.txt
5
1,15,17,13,18,19,6,8,24,4,21,0,3,2,22
26,3,12,27,20,29,28,1,21,15,8,10,18,25,13
29,13,17,26,19,5,10,3,20,11,24,28,27,22,16,4,2,21,14,7
3,28,5,16,15,1,6,23,4,14,2,20,7,25,29,26,24,13,21,12
15,1,13,25,5,17,20,2,27,8,6,26,22,4,21,7,19,29,3,23,10,18,28,12,11

out.txt
4
4
5

7
5
6
7
7
=====註:若加印路徑 且有多個LIS相同,則先出現的優先
4:2,3,4,5
4:2,3,4,5
5:2,3,4,5,11

7:1,15,17,18,19,21,22
5:1,8,10,18,25
6:13,17,19,20,24,27
7:3,5,6,14,20,25,26
7:1,2,4,7,10,18,28



M107a_p10整理牌型

撲克牌的 「大老二」以2最大,然後AKQJT9876543,其中10點以T代表,給你6~13張牌,
請先依花色,每種花色再由大至小排列,花色先黑桃、紅心、方塊、再梅花。
每一列有 6~12個數字,中間以逗號隔開,代表撲克牌的編號:
0~12 spade 的 A234~9TJQK , 13~25 heart的 A234~9TJQK , 
26~38 diamond 的 A234~9TJQK , 39~51 club 的 A234~9TJQK
輸出:先S:,再H:,再D:,再C:,若沒有的花色則不印,請參考輸入輸出範例
in1.txt
2
0,1,2,7,9,13,24,25,32,36,50
12,14,15,22,23,3,39,48,6,8
in2.txt
2
11,16,17,18,20,26,30,31,33,5
19,21,27,28,29,34,35,37,40,45,46,47,49

out.txt
S:2AT83,H:AKQ,D:J7,C:Q
S:K974,H:2JT3,C:AT

S:Q6,H8654,D:A865
H:97,D:2QT943,C:2J987