找回密码
 加入
搜索
查看: 9545|回复: 22

[效率算法] 【已解决】数字字母组合条码算法

 火.. [复制链接]
发表于 2015-1-21 21:59:24 | 显示全部楼层 |阅读模式
本帖最后由 touch_xu 于 2015-1-23 19:44 编辑

请直接看7楼的说明,那里更清析,谢谢!

已经解决,请移步:http://www.autoitx.com/forum.php ... mp;extra=#pid610944

想实现如下条码,写了一半写不下去了.

0000
0001
0002
...
0009
000A
000B
...
00A0
00A1
...
00AA
...
00ZZ
....
ZZZZ

简单的说就是所有4位上都可能是(0-9,A-Z)中的数字,但排除I与O,求简单方法.

到9后就加到A, 到H后跳到J,到O后就跳到P,到Z后就跳到0.

下面是我写的算法,好麻烦,还没有完全完成.
Local $sFilePath1 = "char.txt"

Local $sFilePath2 = "charNew.txt"

$file1 = FileOpen($sFilePath1, 0)
$file2 = FileOpen($sFilePath2, 1)

$i = 1
Do
        FileWriteLine($file2, FileReadLine($file1, $i) & " : " & _GetCharSN(FileReadLine($file1, $i)))
        $i = $i + 1
Until $file1 = -1

FileClose($file2)
FileClose($file1)

Func _CharPlus($Str)
        Local $CharPlus = ""
        If StringLen($Str) = 1 Then
                Switch Asc($Str)
                        Case 48 To 56, 65 To 71, 74 To 77, 80 To 89
                                $CharPlus = Chr(Asc($Str) + 1)
                        Case 57
                                $CharPlus = "A"
                        Case 72
                                $CharPlus = "J"
                        Case 78
                                $CharPlus = "P"
                        Case 90
                                $CharPlus = "0"
                        Case Default
                                $CharPlus = "*"
                EndSwitch
        Else
                $CharPlus = ""
        EndIf
        Return $CharPlus
EndFunc   ;==>_CharPlus

;MsgBox(0, 0, _GetCharSN("AAA0"))

Func _GetCharSN($String)
        Local $SerialNum = ""
        Local $StrLen = StringLen($String)
        Local $OperateBit=StringRight($String, 1)

        If ($StrLen > 0) Then
                $SerialNum = StringReplace($String, $StrLen, _CharPlus($OperateBit), 1, 0)
        EndIf

        Return $SerialNum
EndFunc   ;==>_GetCharSN
Char.txt
0000
111H
222N
333Z
最终的结果就是想写成一个函数如下:

Func GetSN($CurrentStr,$n)
     ;目的是在当前SN基础上,返回增加N后的SN字符串.
     如$CurrentStr="A001" , $n=3, 返回值应该为:A004
     ;如$CurrentStr="ABCD" , $n=3, 返回值应该为:ABCG
     ;如$CurrentStr="ABCH" , $n=3, 返回值应该为:ABCL,自动跳过I
EndFunc
发表于 2015-1-22 01:42:24 | 显示全部楼层
实在搞不懂你的意思是什么
发表于 2015-1-22 11:20:31 | 显示全部楼层
实在搞不懂你的意思是什么
netegg 发表于 2015-1-22 01:42



    LZ 似乎想先整理出一个列表数据库,然后想… 另外写个函数使用…
发表于 2015-1-22 11:45:16 | 显示全部楼层
本帖最后由 afan 于 2015-1-22 11:47 编辑

试了下,共有 1336336 个组合…
MsgBox(0, '', 34 ^ 4)
发表于 2015-1-22 16:27:58 | 显示全部楼层
说问题,要表达出“你想实现什么”,或“输出是什么”
 楼主| 发表于 2015-1-22 17:13:04 | 显示全部楼层
本帖最后由 touch_xu 于 2015-1-22 17:28 编辑
试了下,共有 1336336 个组合…
afan 发表于 2015-1-22 11:45



    对,正是:共有 1336336 个组合,我要的结果是这些组合范围内,返回它之第n个符合要求的字符串。
 楼主| 发表于 2015-1-22 17:18:00 | 显示全部楼层
本帖最后由 touch_xu 于 2015-1-22 17:36 编辑

回复 5# skyfree


我想要的就是一个自定义函数,我不会的就是算法实现(可能要用递归了);

输入:是一个长度为4的字符串 与 一个数字参数n,说明:这个4位的字符器, 每位都可能是(0-9,A-Z)中的数字,但排除I与O。
输出:同样是4位的字符串,但是按规则计算后的。

规则就是:在原字符串上加n,详细规则在顶楼, 下面是例子:

输入"A001" , $n=3, 输出:A004
输入"ABCD" , $n=3, 输出:ABCG
输入"ABCH" , $n=3, 输出:ABCL (自动跳过了I)
输入"ABCZ", $n=1,输出:ABD0

如果换一种方法说的话,就是对下面的函数进行扩展,下面的函数功能完全符合要求,可惜只是针对一位数的。
我要想的就是一个支持4位,或者更多位的且按照相同规则的新函数。

要注意的就是,当最后一位从Z到0的时候,前一位也要加1,依此类摧,总之每位最小为0,最大为Z。
        Local $CharPlus = ""
        If StringLen($Str) = 1 Then
                Switch Asc($Str)
                        Case 48 To 56, 65 To 71, 74 To 77, 80 To 89
                                $CharPlus = Chr(Asc($Str) + 1)
                        Case 57
                                $CharPlus = "A"
                        Case 72
                                $CharPlus = "J"
                        Case 78
                                $CharPlus = "P"
                        Case 90
                                $CharPlus = "0"
                        Case Default
                                $CharPlus = "*"
                EndSwitch
        Else
                $CharPlus = ""
        EndIf
        Return $CharPlus
EndFunc   ;==>_CharPlus
谢谢大家!
 楼主| 发表于 2015-1-22 17:19:11 | 显示全部楼层
实在搞不懂你的意思是什么
netegg 发表于 2015-1-22 01:42



    大哥, 我在7楼有新的说明,现在不知道大家能懂不,十分感谢。
 楼主| 发表于 2015-1-22 17:26:20 | 显示全部楼层
LZ 似乎想先整理出一个列表数据库,然后想… 另外写个函数使用…
afan 发表于 2015-1-22 11:20



  我定的算法误导大家了,我在7楼有的进一步的说明,谢谢大家。
发表于 2015-1-22 18:19:40 | 显示全部楼层
对,正是:共有 1336336 个组合,我要的结果是这些组合范围内,返回它之第n个符合要求的字符串。
touch_xu 发表于 2015-1-22 17:13



    不需要像一楼那样整全部的组合列表,计算量很小,用不着先列表再查表。
可以先将4位字符串用自定义函数转为10进制,进行加n计算后再用自定义函数转为目前的34进制
 楼主| 发表于 2015-1-22 18:42:33 | 显示全部楼层
不需要像一楼那样整全部的组合列表,计算量很小,用不着先列表再查表。
可以先将4位字符串用自定 ...
afan 发表于 2015-1-22 18:19



    说到34进制, 我感觉说的正是我想的, 也就是所谓的34进制, 对一位数的操作已经完成了, 可是对多位的实在是写不下去了,怎么都感觉太复杂了,所以请教简单方法, 十分感谢.
 楼主| 发表于 2015-1-22 18:47:46 | 显示全部楼层
不需要像一楼那样整全部的组合列表,计算量很小,用不着先列表再查表。
可以先将4位字符串用自定 ...
afan 发表于 2015-1-22 18:19



以34为关键字,我还真的找到了,相关算法, 在研究中.
http://blog.163.com/o5655@126/bl ... 283420108205832842/
 楼主| 发表于 2015-1-22 18:49:30 | 显示全部楼层
本帖最后由 touch_xu 于 2015-1-22 18:53 编辑

百度到了, http://zhidao.baidu.com/link?url ... RrAtINxwyfPLPj9X9PS,当然不完全一样,现在想办法写成Au3的
发表于 2015-1-23 08:47:22 | 显示全部楼层
本帖最后由 seniors 于 2015-1-23 08:51 编辑
说到34进制, 我感觉说的正是我想的, 也就是所谓的34进制, 对一位数的操作已经完成了, 可是对多位 ...
touch_xu 发表于 2015-1-22 18:42

一位数的行了,那就把4位分开来做啊,不过效率算法就慢慢琢磨吧
你百度到的这个http://zhidao.baidu.com/link?url ... RrAtINxwyfPLPj9X9PS算法不错,很好转的
发表于 2015-1-23 09:08:55 | 显示全部楼层
本帖最后由 netegg 于 2015-1-23 09:10 编辑

话说会来,可能换个角度想,不用直接列表,把36个字符,进行4字符的排列,最后一个字符是i,o的应该是有规律的,000I和000O应该是19和25,从数组中删除19和25的倍数的元素,就是最后的数组了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-25 13:10 , Processed in 0.086516 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表