[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
用一个临时变量不行吗

TOP

目前有另一种思路,利用单个临时变量循环置换,写了个雏形,但还有些问题没想明白

TOP

本帖最后由 CrLf 于 2015-8-8 15:59 编辑

回复 6# aa77dd@163.com


是这个思路,例:
  1. 'ArrayShift.vbs
  2. Dim arrStr, sInfo
  3. arrStr = Split("0,1,2,3,4,5,6,7,8,9,10,11,12", ",")
  4. sInfo = "原字符串:" & Join(arrStr, ",") & vbCrLf
  5. For i = -20 To 20
  6. sInfo = sInfo & "偏移+" & i & ":" & Join(ArrayShift(arrStr, i), ",") & vbCrLf
  7. Next
  8. WSH.Echo sInfo
  9. Function ArrayShift(ByVal arrStr, ByVal nShift)
  10. Dim arr, nLength, i, s1, s, nOffSet, [起始]
  11. nLength = UBound(arrStr) + 1
  12. nShift = (nShift Mod nLength + nLength) Mod nLength
  13. For [起始] = 0 To [func最大公约数](nLength,nShift) - 1
  14. i = (([起始] + nShift) Mod (nLength))
  15. tmpStr = arrStr(i)
  16. Do While i <> [起始]
  17. nOffSet = ((i + nShift) Mod (nLength))
  18. arrStr(i) = arrStr(nOffSet)
  19. i = nOffSet
  20. Loop
  21. arrStr(nOffSet) = tmpStr
  22. Next
  23. ArrayShift = arrStr
  24. End Function
  25. Function [func最大公约数](ByVal a,ByVal b)
  26. Dim c
  27. If b=0 Then a=0
  28. Do While b <> 0
  29. c = a Mod b
  30. a = b
  31. b = c
  32. Loop
  33. [func最大公约数] = a
  34. End Function
复制代码
代码逻辑:闭环遍历置换,头尾相衔,回到原点时 +1 继续,一直循环到次数不小于元素个数
如此可实现单表无冗余置换,时间复杂度和空间复杂度比较均衡
事实上顶楼是三数组,因为还要算上函数返回值,如果不想设置临时变量,可以直接使用返回值进行映射,省得最后还要传递一次变量
其实我想说的是,楼主还是投奔 JS 党吧...非 VBS 不娶的话,用 wsf 或者 hta 纳个妾也好啊
1

评分人数

    • yu2n: 乐于助人技术 + 1

TOP

本帖最后由 CrLf 于 2015-8-8 16:16 编辑

回复 10# aa77dd@163.com


终于想透彻了
顺便省掉了不必要的 [计数],已修改

------------------------------------------------------------------------------------------
原理解释:

最大公约数是 nLength 和 nShift 都能整除的数字,那么在多轮循环置换后,作用点一定呈相同的栅栏状分布,区别只在于生成的次序:

nShift=2
@1@3@5@7@9

nShift=4
@1@3@5@7@9

nShift=6
@1@3@5@7@9

以回到原点为一周期,那么 周期总数 = 最大公约数
另一方面,最大公约数=1 的时候,“栅栏” 的间隔为 0,所以用一次循环置换就能搞定

TOP

本帖最后由 CrLf 于 2015-12-26 21:26 编辑

回复 13# aa77dd@163.com


   
    其实现在想起来,完全不需要求最大公约数,虽然那是理论支柱,但代码只需要实证结果

TOP

返回列表