----------------解决方案--------------------------------------------------------
谢谢你
----------------解决方案--------------------------------------------------------
象KNOCKER所说的也可以去掉3连号以上的就行,但结果不知道会怎么样,也可能是一个很大的集合
----------------解决方案--------------------------------------------------------
KAI你好,是在这个地方吗? 编程论坛 → 开发语言 → C++论坛 → 『 C++教室 』 → 帖子列表
----------------解决方案--------------------------------------------------------
没这么快,他得先写一个生成基础数据库(就是去全部的4272048 组 - 3连号以上的部分)的程序,写这个程序我估计Kai只需5分钟时间,但是运行这个程序并生成这个数据库,怕是要几天时间.............哈哈哈哈.....你别着急,MM
----------------解决方案--------------------------------------------------------
knocker, 我昨天写了, 对小数据量, 经测试正确, 比如4出3. 7出2等等. 这里请注意一下, 我的机器是很差很差的那种, 没事自己都会死机的那种. 昨天的程序没有用读文件的方式, 因为我想让我的机器试试看, 果然经不起考验, 当我尝试20出7的时候, 机器死机了. 昨天我还有学校的任务, 所以机器重新启动后, 我还是抓紧写我自己的程序了. 对于这个程序, 我会尽量让他高效的, 算法里还得推敲推敲, 我现在的算法, 不是上来就列出所有的可能组合, 而是让他逐层往上生成. 第一层当然是33出1了, 当然就那么33个数. 第二层是在第一层的基础上生成2个数, 依次类推直到第七层. 其实第一层是没有必要的, 因为这33个数本来就是已知的. 所以如果出7的话,就需要6层. 这就好比洗车子, 流水线操作啊. 如果对上面的解释还没有理解, 我举个简单的例子. 就说4出3吧, 第一层当然是 1 2 3 4 接下来, 1 2 3 4 这四个数排好队来到第二层等待处理, 先说一下, 我把每一个单项称为Item 到了第二层, 由 1 产生了 (1 2) (1 3) (1 4) 这三个Item 2 产生了 (2 3) (2 4) 3 产生了 (3 4) 4 不能产生新的Item 将这些Item 放到第三层 (1 2) 产生了 (1 2 3) (1 2 4) (1 3) 产生了 (1 3 4) (1 4) 不能产生新的Item (2 3) 产生了 (2 3 4) (2 4) 不能产生新的Item (3 4) 也不能产生新的Item 最后就只剩下4个Item : (1 2 3) (1 2 4) (1 3 4) (2 3 4) 至于如何判断是否可以产生Item, 还是不可以? 那就是我给Item 赋予了某种功能 他自己能知道是否能够和 1 到 33 中的数产生一个新的Item. 其中很关键的一步是在产生一个Item之后, 要将他放入 ResultVector中去, 这样就产生一个问题, 随着数目的增大,内存空间的占据量太大了, 而且那些Item 都是通过 new 生成的, 地址的杂乱无序, 也给程序的运行带来隐患, 如果你上面的那个数据4272048 没有错的话, 那么至少需要 114 M 的RAM 空间, 如果在加上 copy 的动作, 那就要228M的空间, 我总共才 192 的空间, 所以死机是必然的. 如果读文件, 将产生的Result 不放在 Ram 中而是放在 硬盘上的文件里, 那么死机是可以避免的, 但是速度就很慢很慢了, 真的有可能就要运行一两天了. 还有一个解决办法就是编码, 通过编码压缩数据, 然后通过解码解析数据, 这样的话,或许也行. 让我再想想.
----------------解决方案--------------------------------------------------------
为什么不使用数据库?比如SQL
我的建议如下:
1。先写一个生成基础数据库的程序。其功能是
A。产生所有符合条件(即无3连号以上的数组)的数组
B。这个程序得能中止并保存即时运行进度,并能随时从上次中止处继续运行。//注:生成这个库的时间肯定不会短,或者几十小时,或者几天,甚至是几十天.......我也没具体估算过需要多少时间,有这个功能,你就象断点续传一样,闲时随时运行一下,忙时可中断运行
C。得到这个{ [ 4272048 组 ] 减去 [ 3连号以上数组 ] }所需的基础数据库
//粗粗估算了一下,将会小了很多
2。然后,才写楼主所要的程序
----------------解决方案--------------------------------------------------------
[QUOTE]C。得到这个{ [ 4272048 组 ] 减去 [ 3连号以上数组 ] }所需的基础数据库
//粗粗估算了一下,将会小了很多
[/QUOTE]
算错了,只减少了 27405 组 对最后的结果没有实质性的意义,即最后还有
4272048 - 27405 = 4244643 组
如果一组数7个char来储存,则需 29,712,501个char 空间^_^
----------------解决方案--------------------------------------------------------
我有个新的想法, 非常有可能经筛选后得到的结果是很庞大的。这并不是楼主所希望的结果。 楼主所希望得的最后结果我想不会超过100组,否则就失去意义了。 基于上面的考虑: 先假定,筛选后得到的结果是很庞大的(如果不是,则这个方法是没意义的),楼主所希望得的最后结果不超过100组。 那么,是否可以随机产生一组数,再判定是否符合要求,直至得到100组.
----------------解决方案--------------------------------------------------------
jys07, 程序在C++教室板块贴出来了,下面是这个帖子的连接 符合你题意的解有31组, 如果用 6 4 来测试, 也就是6选4,所得结果为3组。 由于你的题目中的要求,出现相同的3个数便为非法,所以最后的结果就大大的减少了。 http://bbs.bc-cn.net/bbs/dispbbs.asp?boardID=56&ID=27580&page=1
----------------解决方案--------------------------------------------------------