一个算法问题,望各位大虾帮忙……

时间:2021-06-15 17:43:09
我需要产生10万个全不相同的密码(两两之间至少要有两位不一样,而且密码是0到9的数,其他的字符不行),太急了,各位帮我想想!!跪求啊……如果下午再没有答案,皮鞭,蜡烛……我晕,谢谢先……各位大虾,快啊………

15 个解决方案

#1


有人吗?!……5555555……常跪不起……

#2


为什么啊?!大家帮帮忙啊……天哪……

#3


有那么严重吗?
密码多少位?

#4


Dim Dat(2000000) As Boolean

Private Function Ok(ByVal k As Long) As Boolean
  Dim st, st1, st2 As String
  Dim i, j As Long
  st = CStr(k)
  For i = 1 To Len(st)
    st1 = Mid(st, 1, i - 1)
    st2 = Mid(st, i + 1, Len(st) - i)
    For j = 0 To 9
      If Dat(CVar(st1 + CStr(j) + st2)) Then
        Ok = False
        Exit Function
      End If
    Next j
  Next i
  Ok = True
End Function

Private Sub print_Answer(ByVal k As Long)
  Dim kk As Long
  Dim leng As Long
  Dim st As String
  leng = Len(CStr(k))
  For kk = 1 To k
    If Dat(kk) Then
      st = CStr(kk)
      Do Until Len(st) >= leng
        st = "0" & st
      Loop
      List1.AddItem st
    End If
  Next kk
End Sub


Private Sub Command1_Click()
  Dim k, Total As Long
  Dat(0) = True
  Total = 1
  k = 0
  ProgressBar1.Min = 0
  ProgressBar1.Max = 10000
  Do Until Total >= 10000
    Do
     k = k + 1
    Loop Until Ok(k)
    Dat(k) = True
    Total = Total + 1
    ProgressBar1.Value = Total
  Loop
  print_Answer (k)
End Sub

写了个效率不高的,但是还是可以完成任务的。

#5


10W个,位数至少是7位的。

#6


14的密码……跪求……

#7


如果密码位数没有限制,有一种很快速简单的方法:
生成5个两位数字组,保证同一组的任意两个数字的十位和个位都不相等。如(00,11,22,33,44……)、(01,12,23,34……90)等,每个数字组有10个数字,然后用一个5重循环分别从这5个数字组中依次取数字进行组合,可生成10W个10位数字并满足要求。

#8


或都生成两个5位数字组,都包含所有的5位数字(00000也看作是5位数字),然后打乱顺序,再用一个二重循环分别从两个组中取数字并组合在一起。

#9


如果把问题改为,尽量小的10w个 两两之间至少要有两位不一样 的自然数也许更由意思。

#10


用随机数!
每位都用随机数!
比如7位pw[0..7]
每位用随机数的话,重复性是(1/10)^7

#11



    用随机数需要对每个产生的数进行一次检验(与已有的所有数进行比较),速度比较慢。如果对位数没有要求的话,还是应该用更快的方法。
    还有一种方法,可以生成9位符合要求的数字来:
    在0-9中选择9个数字(不重复),求出他们的10W个排列就行了。在元素不重复时,任意两个排列都至少有两位不同,9个元素的排列总数有36W多。

#12


最简单的办法:
从0-100000,其中,用0补足前面的位置。然后再做一个函数,用映射打乱每位置就好。比如每1位换到第5位,第2位换到第7位,。。。。

#13


找660个不同的质素,拆成330+330两个集合,组织一个2重循环,分别从它们中间各取1个进行相乘,就可得到100000个以上且各不相同的数,再在每个数上模加一个大数,就差不多了.


,

#14


楼上怎么证明,?
这好像是个组合问题,怎么用数论方法来解决

#15


不同的素数相乘,仅仅是为了保证结果不同,不是专门的数论方法.

#1


有人吗?!……5555555……常跪不起……

#2


为什么啊?!大家帮帮忙啊……天哪……

#3


有那么严重吗?
密码多少位?

#4


Dim Dat(2000000) As Boolean

Private Function Ok(ByVal k As Long) As Boolean
  Dim st, st1, st2 As String
  Dim i, j As Long
  st = CStr(k)
  For i = 1 To Len(st)
    st1 = Mid(st, 1, i - 1)
    st2 = Mid(st, i + 1, Len(st) - i)
    For j = 0 To 9
      If Dat(CVar(st1 + CStr(j) + st2)) Then
        Ok = False
        Exit Function
      End If
    Next j
  Next i
  Ok = True
End Function

Private Sub print_Answer(ByVal k As Long)
  Dim kk As Long
  Dim leng As Long
  Dim st As String
  leng = Len(CStr(k))
  For kk = 1 To k
    If Dat(kk) Then
      st = CStr(kk)
      Do Until Len(st) >= leng
        st = "0" & st
      Loop
      List1.AddItem st
    End If
  Next kk
End Sub


Private Sub Command1_Click()
  Dim k, Total As Long
  Dat(0) = True
  Total = 1
  k = 0
  ProgressBar1.Min = 0
  ProgressBar1.Max = 10000
  Do Until Total >= 10000
    Do
     k = k + 1
    Loop Until Ok(k)
    Dat(k) = True
    Total = Total + 1
    ProgressBar1.Value = Total
  Loop
  print_Answer (k)
End Sub

写了个效率不高的,但是还是可以完成任务的。

#5


10W个,位数至少是7位的。

#6


14的密码……跪求……

#7


如果密码位数没有限制,有一种很快速简单的方法:
生成5个两位数字组,保证同一组的任意两个数字的十位和个位都不相等。如(00,11,22,33,44……)、(01,12,23,34……90)等,每个数字组有10个数字,然后用一个5重循环分别从这5个数字组中依次取数字进行组合,可生成10W个10位数字并满足要求。

#8


或都生成两个5位数字组,都包含所有的5位数字(00000也看作是5位数字),然后打乱顺序,再用一个二重循环分别从两个组中取数字并组合在一起。

#9


如果把问题改为,尽量小的10w个 两两之间至少要有两位不一样 的自然数也许更由意思。

#10


用随机数!
每位都用随机数!
比如7位pw[0..7]
每位用随机数的话,重复性是(1/10)^7

#11



    用随机数需要对每个产生的数进行一次检验(与已有的所有数进行比较),速度比较慢。如果对位数没有要求的话,还是应该用更快的方法。
    还有一种方法,可以生成9位符合要求的数字来:
    在0-9中选择9个数字(不重复),求出他们的10W个排列就行了。在元素不重复时,任意两个排列都至少有两位不同,9个元素的排列总数有36W多。

#12


最简单的办法:
从0-100000,其中,用0补足前面的位置。然后再做一个函数,用映射打乱每位置就好。比如每1位换到第5位,第2位换到第7位,。。。。

#13


找660个不同的质素,拆成330+330两个集合,组织一个2重循环,分别从它们中间各取1个进行相乘,就可得到100000个以上且各不相同的数,再在每个数上模加一个大数,就差不多了.


,

#14


楼上怎么证明,?
这好像是个组合问题,怎么用数论方法来解决

#15


不同的素数相乘,仅仅是为了保证结果不同,不是专门的数论方法.