小春网

 找回密码
 注册账号
楼主: 陈酿
收起左侧

[IT 交流] 这个循环怎么改

[复制链接]
发表于 2011-12-9 14:47:36 | 显示全部楼层
本帖最后由 ペコチャン 于 2011-12-9 14:48 编辑

嘿嘿 我很耐心地看了 有点绕~ 不过我看懂LZ的意思了
就是把一串数字里的重复次数输出出来。
就如LZ的例子
2 3 2 1 1 3 1 1 3
这串数字里1重复了4次,2重复了2次,3重复了3次
所以输出是
2 3 2 4 4 3 4 4 3

LZ用的啥语言 我不懂的说
但是我觉得你4个循环内嵌套有点问题~
我的想法是
做一组中间数组
第一次循环把重复次数存到中间数组
中间数组应该是这样的
{(2,2),(3,3),(1,4)}
然后第二次循环,把中间数组中相应的循环次数取出

我的方法应该有点烦 坐等高人一次循环搞定哈

评分

参与人数 1 +30 收起 理由
憨吃迷糊睡 + 30 赞一个

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2011-12-9 15:31:26 | 显示全部楼层
ペコチャン 发表于 2011-12-9 14:47
嘿嘿 我很耐心地看了 有点绕~ 不过我看懂LZ的意思了
就是把一串数字里的重复次数输出出来。
就如LZ的例子

换个例子 10 23  10 15 10 15 23 23 10
想要的rcount 结果是
              4  3    4    2   4   2   3   3   4
现在的rcount结果是
              4  3    3   2    2    1  2   1   1

这么说明白了吧
回复

使用道具 举报

发表于 2011-12-9 15:39:15 | 显示全部楼层
陈酿 发表于 2011-12-9 15:31
换个例子 10 23  10 15 10 15 23 23 10
想要的rcount 结果是
              4  3    4    2   4   2    ...

我看明白了
也给你提出方案了
回复

使用道具 举报

 楼主| 发表于 2011-12-9 15:59:09 | 显示全部楼层
ペコチャン 发表于 2011-12-9 15:39
我看明白了
也给你提出方案了

我菜鸟。。。。。啥都不会。。。。
回复

使用道具 举报

发表于 2011-12-9 16:17:35 | 显示全部楼层
意思是看懂了,语言也知道 vb.net
你一开始的数组是怎么来的 放在了哪 又要输出到哪
你把完整的代码贴出来
回复

使用道具 举报

 楼主| 发表于 2011-12-9 16:25:43 | 显示全部楼层
snowman1101 发表于 2011-12-9 16:17
意思是看懂了,语言也知道 vb.net
你一开始的数组是怎么来的 放在了哪 又要输出到哪
你把完整的代码贴出来 ...

语言是vba
  1. Sub Interior()
  2.     Dim m As Long
  3.     Dim n As Long
  4.    
  5.     Dim i As Long
  6.     Dim j As Long
  7.     Dim k As Long
  8.     Dim l As Long
  9.     Dim rcount As Long

  10.    
  11.     Worksheets("Sorting").Copy after:=Worksheets("Sorting")
  12.     ActiveSheet.Name = "Interior competition"
  13.     Worksheets("Interior competition").Activate
  14.     ActiveCell.CurrentRegion.Select
  15.     m = Selection.Rows.count
  16.     n = Selection.Columns.count
  17.    
  18.     rcount = 0
  19.         
  20.     For k = St To Si
  21.         For i = mstarting(k) To mstarting(k) + ma(k) - 1
  22.             For j = 2 To n - Descolumncount
  23.                 For l = mstarting(k) To mstarting(k) + ma(k) - 1
  24.                     If Cells(i, j) = Cells(l, j) Then
  25.                         rcount = rcount + 1
  26.                     End If
  27.                 Next l
  28.                  
  29.             
  30.                 Cells(i, j) = rcount / ma(k)
  31.                 rcount = 0
  32.             Next j
  33.             Next i
  34.     Next k
  35.    
  36. End Sub
复制代码

部分变量定义在全局里

回复

使用道具 举报

发表于 2011-12-9 16:40:24 | 显示全部楼层
看来我这编程也不怎么样 看了半天也没看明白mstarting ,Descolumncount ,ma 都是什么函数
回复

使用道具 举报

 楼主| 发表于 2011-12-9 16:47:48 | 显示全部楼层
snowman1101 发表于 2011-12-9 16:40
看来我这编程也不怎么样 看了半天也没看明白mstarting ,Descolumncount ,ma 都是什么函数 ...

您谦虚了

我把n列数据根据Descolumncount开始到n的数据大小的分组。(对程序没有太大影响)
第一组是St,最后一组是Si
mstarting(k)是每一组的第一个元素,是每组的数据的个数。
ma是每组元素的个数
回复

使用道具 举报

发表于 2011-12-9 17:29:43 | 显示全部楼层
先看 你最里层的循环
  1. For l = mstarting(k) To mstarting(k) + ma(k) - 1

  2.         If Cells(i, j) = Cells(l, j) Then

  3.            rcount = rcount + 1

  4.         End If

  5. Next l
复制代码
比如第一次循环时 K=1,你的 For l = mstarting(k) To mstarting(k) + ma(k) - 1
那么 某一组的第一个数据就是mstarting(1)
可是到了第2次循环的时候 某一组的第一个数据 就是mstarting(2) 了
所以没循环一次 就是减少比较一个数据,当然比出来的个数就会每次减少1了
回复

使用道具 举报

发表于 2011-12-9 17:43:17 | 显示全部楼层
还有 vba的话 你为什么不用 WorksheetFunction.CountIf
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小春网
常务客服微信
微信订阅号
手机客户端
扫一扫,查看更方便! 快速回复 返回顶部 返回列表