Office中国论坛/Access中国论坛
标题: [高0]求最短的代码. [打印本页]
作者: lwwvb 时间: 2005-3-19 03:09
标题: [高0]求最短的代码.
要求用户输入一个字串,电脑输出这个字串的全排序,如:
当用户输入"ABC"时,电脑输出:
ABC
ACB
BAC
BCA
CAB
CBA
当用户输入"ABCD"时,电脑输出:
ABCD
ABDC
ACBD
ACDB
...
最短代码者胜出![em03]
作者: 情比金坚 时间: 2005-3-20 02:17
Dim a, x, y, z As String
Dim i, s, n, k As Integera = InputBox("请输入一个字附串")
i = Len(a)
's 为完全排列的总数量
s = i
For n = 1 To i - 1
s = s * (i - n)
NextDo
Do
x = Mid(a, Int(Rnd * i + 1), 1)
If InStr(y, x) = 0 Then y = y & x
Loop Until Len(y) = i
If InStr(z, y) = 0 Then
z = z & y & ";"
y = ""
k = k + 1
End If
Loop Until k = s
MsgBox z
作者: lwwvb 时间: 2005-3-20 03:58
情比金坚的答案不行呀,我输入了ABC之后再执行,没有输出正确的答案..有人能做这题吗?[em08]
作者: 情比金坚 时间: 2005-3-20 04:55
我也知道,还在想,你认为错在哪了?(用for...next,多试几次就行)
[attach]9498[/attach]
请李老师指点一下:我的想法那么单纯,为啥实现不了呢?
[此贴子已经被作者于2005-3-19 22:35:57编辑过]
作者: lwwvb 时间: 2005-3-20 09:55
这种算法是不行的.你使用RND来求所有的可能排序,如果用户输入的字串很长,如"abcdefg",序列的数量就会非常多,RND什么时候才能碰得完所有的序列?很可能等上非常上的时间才能完成,或者永远也完成不了,因为RND是一个未知值,等待的时间也是未知的!!![em06]我用的算法,只是执行几条指令就可以马上得到新的排序.而且是按顺序的.所有指令执行完的话,就已经求出了全部的排序.千万不能少看这题目,有兴趣的人可以做做....[em07]
作者: 情比金坚 时间: 2005-3-20 21:31
可以完成,但我想有点犯规:
[attach]9503[/attach]
只有我们在玩,他们都不来~~~~~~[em04]
[此贴子已经被作者于2005-3-20 13:33:30编辑过]
作者: Trynew 时间: 2005-3-20 23:28
[attach]9505[/attach]
Private Sub 命令0_Click()
Dim i As Integer, j As Integer, strSql(4) As String
For i = 0 To DCount("*", "表1") - 1
strSql(1) = strSql(1) & " & [" & i & "]"
strSql(2) = strSql(2) & ",[" & i & "].txt as " & i
strSql(3) = strSql(3) & ",表1 as " & i
For j = i + 1 To DCount("*", "表1") - 1
strSql(4) = strSql(4) & " and [" & i & "]<>[" & j & "]"
Next j
Next
CurrentDb().QueryDefs("Sql").SQL = "SELECT " & Mid(strSql(1), 4) & " as Str FROM (select " & Mid(strSql(2), 2) & " from " & Mid(strSql(3), 2) & ") where (" & Mid(strSql(4), 6) & ")"
DoCmd.OpenQuery "Sql"
End Sub
作者: lwwvb 时间: 2005-3-21 02:56
Trynew的方法可是强哦,我用的是纯计算方法.看来TryNew的代码是最短了.哈哈....[em02]
作者: 情比金坚 时间: 2005-3-21 03:43
可是我连计算也不会,只会瞎猫抓耗子的方法,李老师给个提示看看[em02]
作者: lwwvb 时间: 2005-3-21 07:48
插入一个模块,再运行RunMe就可以了.
Dim InPutString As String
Sub GetData(s As String, temp As String)
Dim i As Integer
If Len(temp) = Len(InPutString) Then
MsgBox temp
Else
For i = 1 To Len(s)
GetData Left(s, i - 1) & Right(s, Len(s) - i), temp + Mid(s, i, 1)
Next i
End If
End Sub
Sub RunMe()
InPutString = InputBox("请输入一个字串:", , "ABC")
GetData InPutString, ""
End Sub
[em05]呵呵,经过代码优化,我只用了11句代码哩!!(不含过程首尾)
[此贴子已经被作者于2005-3-20 23:49:42编辑过]
作者: 情比金坚 时间: 2005-3-21 22:24
果然精妙!不过TRYNEW的方法让我领略到查询的精深,下回生成大量随机文本数据的时候,我会用他的代码。
作者: lwwvb 时间: 2005-3-22 03:55
TRYNEW的方法相当于嵌套N层FOR语句.而我的方法是使用递归.有空的时候,我再出更有趣的题目...[em05]
作者: quanli 时间: 2005-3-22 23:05
我不懂,,,,学习学习。。。。
作者: jgh2008 时间: 2005-3-23 23:46
在几位面前,我现在只能当看客了!
作者: liaoliao 时间: 2008-8-2 19:14
学习[:45] [:45] [:45]
作者: kevindeng 时间: 2008-9-2 11:51
这个题目用递归最好的办法
作者: GOODWIN 时间: 2021-10-10 14:32
向高手学习
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) |
Powered by Discuz! X3.3 |