推 higger:大大...謝謝你~~我先研究個二個小時!!! 59.105.108.50 04/26
> -------------------------------------------------------------------------- <
作者: higger (朝鄉而行) 看板: Visual_Basic
標題: Re: [請益] 請教這段程式碼~~~
時間: Tue Apr 26 22:43:41 2005
'此回圈y的變化為:
'y = a(1) + b(1) + c(1) = 1 + 4 + 9 = 14
'->y = 14 + a(2) + b(2) + c(2) = 14 + 6 = 20
'以下類推->20 + 17 + 3 = 40
y = 0
For i = 1 To 4
y = y + a(i) + b(i) + c(i)
Next i
關於這段...我想再請教一下~
i = 1 to 4
i=1
y=a(1) + b(1) + c(1)=1+4+9=14
i=2
y=14+a(2) + b(2) + c(2)=14+1+4+1=20
i=3
y=20+a(3) + b(3) + c(3)=20+8+NULL+9=37
i=4
y=37+a(4) + b(4) + c(4)=37+1+2+0=40
故四個總和是
14+20+37+40=111 (!?)
所以用mod後...餘數不為零呀??
大大...我到底是錯在那?是i=3那...null不可視為零嗎?
另外...
在i=1時
等號右方那個y...為啥會是零?
(依你的算法判斷...你把它當零~)
謝謝~
※ 引述《linmic (sOMeThiNGwRoNg)》之銘言:
: 用你給的Code來檢驗
: 以97179430--這個合格(傳回True)的統編來看:
: Public Function SysUniNoChk(ByVal UniNo) As Boolean
: '帶入八位字串or 數字.正確傳傳回true
: Dim s As String
: Dim i As Integer
: Dim d(9) As Integer
: Dim a(5) As Integer
: Dim b(5) As Integer
: Dim c(5) As Integer
: Dim y As Long
: s = Trim(UniNo & "") '現在s = 97179430
: '若輸入的非數字,或字串長不等於8,則離開此Function
: If (IsNumeric(UniNo) = False Or Len(s) <> 8) Then
: SysUniNoChk = False
: Exit Function
: End If
: '以下的程式碼皆為合法的輸入所使用以驗證
: '現在先算d(1), d(2), d(3), ..... ,d(8)的值
: '以97179430來算: d(1) = 9, d(2) = 7, d(3) = 1, d(4) = 7, .... , d(8) = 0
: For i = 1 To 8
: d(i) = Val(0 & Mid(s, i, 1)) '此行為取出字串(s)之第一個字元並轉值
: Next i
: '現在算a(1), a(2), a(3)
: 'a(1) = Mid(d(2 * 1) * 2, 1, 1) = 1 (Mid(d(2 * 1) * 2, 1, 1) = 14,所以取1)
: 'a(2), a(3)同理 : a(2) = 1, a(3) = 8
: 'b(1) = Mid(d(2 * 1) * 2, 2, 1) = 4 (算出是14,取第二位所以是4)
: 'b(2), b(3)同理 : b(2) = 4, b(3) = Null(沒東西)
: For i = 1 To 3
: a(i) = Val(0 & Mid(d(2 * i) * 2, 1, 1))
: b(i) = Val(0 & Mid(d(2 * i) * 2, 2, 1))
: Next i
: '根據上面的解釋自己推 : a(4) = 1, b(4) = 2
: 'c(1) = d(1) = 9, c(2) = d(3) = 1, c(3) = d(5) = 9, c(4) = d(8) = 0
: a(4) = Val(Mid(d(7) * 4, 1, 1)) : b(4) = Val(Mid(d(7) * 4, 2, 1))
: c(1) = d(1) : c(2) = d(3) : c(3) = d(5) : c(4) = d(8)
: '此回圈y的變化為:
: 'y = a(1) + b(1) + c(1) = 1 + 4 + 9 = 14
: '->y = 14 + a(2) + b(2) + c(2) = 14 + 6 = 20
: '以下類推->20 + 17 + 3 = 40
: y = 0
: For i = 1 To 4
: y = y + a(i) + b(i) + c(i)
: Next i
: '以下為總判斷式
: '若y除以10的餘數為0(整除),那麼就判斷他為合法的統編
: '因為97179430在這裡就被認定合格了,故回傳True
: If y Mod 10 = 0 Then
: SysUniNoChk = True
: y = 0 '初始化
: '若不是整除的情況,則
: Else
: '情況一: (參照上面的說明)
: If d(7) = 7 Then '若d(7) = 7 則
: a(5) = Val(Mid(a(4) + b(4), 1, 1))
: For i = 1 To 3
: y = a(i) + b(i) + c(i)
: Next i
: y = y + a(5) + c(4)
: If y Mod 10 = 0 Then
: SysUniNoChk = True '此統編合法
: Else
: SysUniNoChk = False '此統編不合法
: End If
: '剩下的情況:
: Else
: SysUniNoChk = False '此統編不合法
: End If
: End If
: End Function
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.105.108.50
> -------------------------------------------------------------------------- <
作者: higger (朝鄉而行) 看板: Visual_Basic
標題: Re: [請益] 請教這段程式碼~~~
時間: Tue Apr 26 22:49:55 2005
sorry...程式好像沒要加總再mod...
而是推到i=4時...
來mod to y...
那y=40...是合乎條件了...
還有那個i=1時的y...
好像依稀記得n年前的計概老師說過...
寫程式...等號是倒過來看的..
左邊是右邊的結果...
謝謝大大...
我想個簡捷有力地...
再來描述檢查統編方法的白話文版
※ 引述《higger (朝鄉而行)》之銘言:
: '此回圈y的變化為:
: 'y = a(1) + b(1) + c(1) = 1 + 4 + 9 = 14
: '->y = 14 + a(2) + b(2) + c(2) = 14 + 6 = 20
: '以下類推->20 + 17 + 3 = 40
: y = 0
: For i = 1 To 4
: y = y + a(i) + b(i) + c(i)
: Next i
: 關於這段...我想再請教一下~
: i = 1 to 4
: i=1
: y=a(1) + b(1) + c(1)=1+4+9=14
: i=2
: y=14+a(2) + b(2) + c(2)=14+1+4+1=20
: i=3
: y=20+a(3) + b(3) + c(3)=20+8+NULL+9=37
: i=4
: y=37+a(4) + b(4) + c(4)=37+1+2+0=40
: 故四個總和是
: 14+20+37+40=111 (!?)
: 所以用mod後...餘數不為零呀??
: 大大...我到底是錯在那?是i=3那...null不可視為零嗎?
: 另外...
: 在i=1時
: 等號右方那個y...為啥會是零?
: (依你的算法判斷...你把它當零~)
: 謝謝~
: ※ 引述《linmic (sOMeThiNGwRoNg)》之銘言:
: : 用你給的Code來檢驗
: : 以97179430--這個合格(傳回True)的統編來看:
: : Public Function SysUniNoChk(ByVal UniNo) As Boolean
: : '帶入八位字串or 數字.正確傳傳回true
: : Dim s As String
: : Dim i As Integer
: : Dim d(9) As Integer
: : Dim a(5) As Integer
: : Dim b(5) As Integer
: : Dim c(5) As Integer
: : Dim y As Long
: : s = Trim(UniNo & "") '現在s = 97179430
: : '若輸入的非數字,或字串長不等於8,則離開此Function
: : If (IsNumeric(UniNo) = False Or Len(s) <> 8) Then
: : SysUniNoChk = False
: : Exit Function
: : End If
: : '以下的程式碼皆為合法的輸入所使用以驗證
: : '現在先算d(1), d(2), d(3), ..... ,d(8)的值
: : '以97179430來算: d(1) = 9, d(2) = 7, d(3) = 1, d(4) = 7, .... , d(8) = 0
: : For i = 1 To 8
: : d(i) = Val(0 & Mid(s, i, 1)) '此行為取出字串(s)之第一個字元並轉值
: : Next i
: : '現在算a(1), a(2), a(3)
: : 'a(1) = Mid(d(2 * 1) * 2, 1, 1) = 1 (Mid(d(2 * 1) * 2, 1, 1) = 14,所以取1)
: : 'a(2), a(3)同理 : a(2) = 1, a(3) = 8
: : 'b(1) = Mid(d(2 * 1) * 2, 2, 1) = 4 (算出是14,取第二位所以是4)
: : 'b(2), b(3)同理 : b(2) = 4, b(3) = Null(沒東西)
: : For i = 1 To 3
: : a(i) = Val(0 & Mid(d(2 * i) * 2, 1, 1))
: : b(i) = Val(0 & Mid(d(2 * i) * 2, 2, 1))
: : Next i
: : '根據上面的解釋自己推 : a(4) = 1, b(4) = 2
: : 'c(1) = d(1) = 9, c(2) = d(3) = 1, c(3) = d(5) = 9, c(4) = d(8) = 0
: : a(4) = Val(Mid(d(7) * 4, 1, 1)) : b(4) = Val(Mid(d(7) * 4, 2, 1))
: : c(1) = d(1) : c(2) = d(3) : c(3) = d(5) : c(4) = d(8)
: : '此回圈y的變化為:
: : 'y = a(1) + b(1) + c(1) = 1 + 4 + 9 = 14
: : '->y = 14 + a(2) + b(2) + c(2) = 14 + 6 = 20
: : '以下類推->20 + 17 + 3 = 40
: : y = 0
: : For i = 1 To 4
: : y = y + a(i) + b(i) + c(i)
: : Next i
: : '以下為總判斷式
: : '若y除以10的餘數為0(整除),那麼就判斷他為合法的統編
: : '因為97179430在這裡就被認定合格了,故回傳True
: : If y Mod 10 = 0 Then
: : SysUniNoChk = True
: : y = 0 '初始化
: : '若不是整除的情況,則
: : Else
: : '情況一: (參照上面的說明)
: : If d(7) = 7 Then '若d(7) = 7 則
: : a(5) = Val(Mid(a(4) + b(4), 1, 1))
: : For i = 1 To 3
: : y = a(i) + b(i) + c(i)
: : Next i
: : y = y + a(5) + c(4)
: : If y Mod 10 = 0 Then
: : SysUniNoChk = True '此統編合法
: : Else
: : SysUniNoChk = False '此統編不合法
: : End If
: : '剩下的情況:
: : Else
: : SysUniNoChk = False '此統編不合法
: : End If
: : End If
: : End Function
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.105.108.50
> -------------------------------------------------------------------------- <
作者: higger (朝鄉而行) 看板: Visual_Basic
標題: Re: [請益] 請教這段程式碼~~~
時間: Tue Apr 26 23:44:18 2005
謝謝...我實驗成功了~
雖然我看不懂vb...
但我想我能努力把它寫成vba...
用在excel上~~~
另外..原程式中後面有個但書...
若第一階段用10除餘數不為0...還有可能成立...
即這段
If d(7) = 7 Then '若d(7) = 7 則
a(5) = Val(Mid(a(4) + b(4), 1, 1))
For i = 1 To 3
y = a(i) + b(i) + c(i)
Next i
y = y + a(5) + c(4)
If y Mod 10 = 0 Then
SysUniNoChk = True
先決條件...第7位數為7
然後算a5
再算這段
For i = 1 To 3
y = a(i) + b(i) + c(i)
Next i
即a1+b1+...+c3為止
再把這個值+a5+c4...看這數被10除會不會餘數又是0
若0則成立
這或許是怕原設計碼數會不夠用...故增加這個條件~~~
呼~~~
研究出來是一種程度...直接看懂又是一個層次...寫的出來又是一種境界...
世界真是無盡呀~~~
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.105.108.50
→ higger:像84915871就是走第二個條件~~` 59.105.108.50 04/26