挑战你的大脑!

netcrawller 2004-06-19 12:02:29

现求一算法

用一四位定长的串表示一个十进制数(ID)
e.g.
当ID>=0 到 ID <=9999时表示为 0000 ~ 9999
当ID=10000时,表示为A000,以此类推,当排到A999时,下一个ID表示为B000
.....
当Z999后的ID为AA00,排到ZZZZ为止.


目标如下:
实现一个函数完成 ParseNumber(10000)=A000 及 DeParse("A000")=10000

解决问题后,马上给分!不够再加.

...全文
611 76 打赏 收藏 转发到动态 举报
写回复
用AI写文章
76 条回复
切换为时间正序
请发表友善的回复…
发表回复
CsdnRob 2004-07-01
  • 打赏
  • 举报
回复
reply to: zushenf(一堆大便) 原因有很多种,但你至少要给出不能调试的现象,如:提示什么错误,大家才好来分析啊
netcrawller 2004-06-23
  • 打赏
  • 举报
回复
还有一点小问题,你算出的若是 A32 能显示出 A032就对了.
netcrawller 2004-06-23
  • 打赏
  • 举报
回复
TO: baizhj(baizhj)

谢谢,完全正确,不过能给出Deparse的吗?

如果你可以给我们讲讲你的思想就更好了.
BlueBeer 2004-06-23
  • 打赏
  • 举报
回复
所以我说这套表示法只能表示到10000+26*1000+26*100+26*10+25*4=38960
BlueBeer 2004-06-23
  • 打赏
  • 举报
回复
请各位注意进位的方法,他的进位法总是从最前一位开始的,而不是我们常见的从前一位开始,这话有点乱,呵呵
常见的:0……9→A……Z进位10……19→1A……1Z进位20
楼主的:数字的部分,沿用正常的进位方法,字母部分则相反
9999→A000……A999→B000……B999→C000……Z999
这时看清楼主怎么进位→AA00……
AA00之后,进位规则肯定得沿用前面的进位方法,也即最终数字们进完时是这样的AAZ9,这时应该进位成什么,只能是AAAA
如果我的代码有什么问题,只会出现在AAAA之后,因为这一段楼主没有交待,只能按他前面的进位规律来进行,上面说过了,字母部分总是先从最前一位开始进位,所以我进成了BAAA,所以我说,AAAA之后,一位字母就只能表示到25了,即BAAA至ZAAA,第一位至此完全用完,往下进位(这话听着也乱,呵呵)ZBAA,直到ZZAA,依此类推,直到ZZZZ结束
BlueBeer 2004-06-23
  • 打赏
  • 举报
回复
呵呵,还是没看到更正确的代码~

建议再回帖的同志,先用我的代码生成结果文件看一看,对照楼主题目的要求分析后再回复,呵呵
我的代码在1秒内罗列出所有结果(0-38960),不会耽误你太多的宝贵时间啦,呵呵~
flyingscv 2004-06-22
  • 打赏
  • 举报
回复
如果我没想错的话,后面的一个ZZ**之类数字用需要推算很多次的才可以推出来,这个繁重的任务也只能让计算机处理
flyingscv 2004-06-22
  • 打赏
  • 举报
回复
BlueBeer的应该是不对的
如果不用递规只用select case 至少要上百个(没仔细想过,肯定超过500个)
用递规是费时间的(单个是无所谓的),实际可以考虑先处理完存入数组,利用处理结果计算
BlueBeer 2004-06-22
  • 打赏
  • 举报
回复
楼上的,楼主他就是这么要求的啊,其实你的表示方法比楼主要好一些,不过最好还是直接用36进制,不足3位前面用0补齐,这样多规范,运算方便,逆运算也方便,最大可以表示到:
?36^4
1679616
BlueBeer 2004-06-22
  • 打赏
  • 举报
回复
另,请务必用我前面给过你的代码编译成EXE后执行并分析生成的文本文件

生成的文本文件中包含所有的结果(0-38960)
BlueBeer 2004-06-22
  • 打赏
  • 举报
回复
如果这样你还不满意,只能请你补充你的条件,因为你题目中的条件我已经全部满足了

这个我已经在上面的一次回复中说过了,再复制一遍给你看,请对照你的题目要求与我的Debug结果核实清楚

回复人: BlueBeer(1win) ( ) 信誉:111 2004-06-20 15:02:00 得分: 0


请看清楼主的要求:
用一四位定长的串表示一个十进制数(ID)
e.g.
当ID>=0 到 ID <=9999时表示为 0000 ~ 9999
当ID=10000时,表示为A000,以此类推,当排到A999时,下一个ID表示为B000
.....
当Z999后的ID为AA00,排到ZZZZ为止.

用我上面的函数与下面的代码来测试:

Private Sub Form_Load()
Debug.Print 0, ParseNumber(0)
Debug.Print , "……"
Debug.Print 9999, ParseNumber(9999)
Debug.Print 10000, ParseNumber(10000)
Debug.Print , "……"
Debug.Print 10999, ParseNumber(10999)
Debug.Print 11000, ParseNumber(11000)
Debug.Print , "……"
Debug.Print 35999, ParseNumber(35999)
Debug.Print 36000, ParseNumber(36000)
Debug.Print , "……"
Debug.Print 38960, ParseNumber(38960)
End Sub

Debug结果:
0 0000
……
9999 9999
10000 A000
……
10999 A999
11000 B000
……
35999 Z999
36000 AA00
……
38960 ZZZZ


BlueBeer 2004-06-22
  • 打赏
  • 举报
回复
//TO:BlueBeer(1win)
//应该有 26*1000+26*26*100+26*26*26*10+26^4+10000 个可用.

如果是这样,那就是题意表达有误了
请详细解释你上面的表达式

我的算法是完全按你的题意来做的,可表示0-38960
即:10000+26000+2600+260+100
10000即A000
26000即每一个字母每个表示1000即26*1000
2600即第二个字母每个表示100即26*100
260即第三个字母每个表示10即26*10
以上的最大表示是AAZ9即38859,再加1等于AAAA
至此,每位字母只能表示26-1(去掉A),四位字母共可表示(26-1)*4即100

recollectpainer 2004-06-22
  • 打赏
  • 举报
回复
to: 楼主

晕哟

Z999 后面一个是 AA00 ??
这是怎么加出来的??
Z999 加一应该等于 ZA00 才对呀???
flyingscv 2004-06-22
  • 打赏
  • 举报
回复
呵呵,我也只是想确定一下
好多人没看明白吧
flyingscv 2004-06-22
  • 打赏
  • 举报
回复
倒,楼主可不可以确定一下我问的啊
flyingscv 2004-06-22
  • 打赏
  • 举报
回复
回复人: wacky(笨笨狗) ( ) 信誉:100 2004-06-22 13:45:00 得分: 0


帮楼主更正:当Z999后的ID为ZA00,排到ZZZZ为止.
------------------------------------------------------------

我再更正回Z999+1=AA00 :)

不然没有意义
baizhj 2004-06-22
  • 打赏
  • 举报
回复
补充:
1、在ParseNumber中的第一条语句前面加上一句Call Init()
2、DeParse的想法基本相同
baizhj 2004-06-22
  • 打赏
  • 举报
回复
Dim Lower(0 To 4) As Long

Private Sub Init()
Dim j As Integer

Lower(0) = 0
For j = 1 To 4 Step 1
Lower(j) = Lower(j-1) + (26^(j-1))*(10^(4-(j-1)))
Next j
End Sub

Private Function ParseNumber(num As Long) As String
Dim temp As Long,t As Long
Dim ret As String
Dim j As Integer

For j = 4 To 0 Step -1
If num >= Lower(j) Then
temp = num - Lower(j)
Exit For
End If
Next j

Select Case j
Case 4
ret = Chr$(Asc("A") + (((temp \ 26)\26)\26))
ret = ret + Chr$(Asc("A") + (((temp \ 26)\26) mod 26))
ret = ret + Chr$(Asc("A") + ((temp \ 26) mod 26))
ret = ret + Chr$(Asc("A") + (temp mod 26))
Case 3
ret = Chr$(Asc("A") + (((temp \ 10) \ 26)\26))
ret = ret + Chr$(Asc("A") + (((temp \ 10) \ 26) mod 26))
ret = ret + Chr$(Asc("A") + ((temp \ 10) mod 26))
ret = ret + Str(temp mod 10)
Case 2
ret = Chr$(Asc("A") + ((temp \ 100) \ 26))
ret = ret + Chr$(Asc("A") + ((temp \ 100) mod 26))
ret = ret + Str(temp mod 100)
Case 1
ret = Chr$(Asc("A") + ((temp \ 1000) mod 26))
ret = ret + Str(temp mod 1000)
Case 0
ret = Str(temp)
End Select

ParseNumber = ret
End Function
pigpag 2004-06-22
  • 打赏
  • 举报
回复
!@#$%^&*()(*&^%$#}|>*&
runnersun 2004-06-22
  • 打赏
  • 举报
回复
帮楼主更正:当Z999后的ID为ZA00,排到ZZZZ为止.
加载更多回复(56)

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧