免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 吴秦
打印 上一主题 下一主题

[算法] 发个简单的题目 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-04-25 14:57 |只看该作者
看错了

[ 本帖最后由 glasslion 于 2009-4-25 08:02 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2009-04-25 14:59 |只看该作者
从123..329枚举n,看n,n*2,n*3是否覆盖了各个数字

[ 本帖最后由 glasslion 于 2009-4-25 08:10 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2009-04-25 15:07 |只看该作者
原帖由 liaohuangen 于 2009-4-7 14:22 发表
我觉得这个方法最好!!!虽然有点投机...但效率最高....
你不是要1:2:3吗???
可以这样:
(1:2:3)*1=(1:2:3)
(1:2:3)*2=(2:4:6)
(1:2:3)*3=(3:6:9)
(1:2:3)*4=(4:8:12)
在实际中真要遇到这样的情况...我想这 ...


应该是这样效率最高。刚刚想岔了

论坛徽章:
0
14 [报告]
发表于 2009-04-25 15:31 |只看该作者
发个PHP版 的!!

  1. <?php
  2. $datas = array();
  3. for($i = 1; $i <= 9; $i++) {
  4.         for($j = 1; $j <= 9; $j++) {
  5.                 for($k = 1; $k <= 9; $k++) {
  6.                         if($j != $i && $k != $j && $k != $i) {
  7.                                 $datas[] = $i * 100 + $j * 10 + $k;
  8.                         }
  9.                 }
  10.         }
  11. }
  12. $result = array();
  13. foreach($datas as $data) {
  14.         if($data * 3 > 999) break;
  15.         if(in_array($data * 2, $datas) && in_array($data * 3, $datas)) {
  16.                 $result[] = $data.':'.($data * 2).':'.($data * 3);
  17.         }
  18. }
  19. print_r($result)
  20. ?>
复制代码

论坛徽章:
0
15 [报告]
发表于 2009-04-27 20:16 |只看该作者

回复 #6 libin1983 的帖子

你的judge函数效率太低。
个人觉得要覆盖1-9之间的数值只要它们的乘积等于9!并且它们的和等于45即可。

论坛徽章:
0
16 [报告]
发表于 2009-04-27 20:57 |只看该作者

回复 #6 libin1983 的帖子

按照你的思路改写了一下:

  1. #include <stdio.h>

  2. bool judge( int a, int b, int c )
  3. {
  4.     char tmp_buf[ 10 ];
  5.     sprintf( tmp_buf, "%d%d%d", a, b, c );

  6.     int nTimeResult = 1;
  7.     int nSumResult = 0;
  8.     for ( int i = 0; i < 9; i++ )
  9.     {
  10.         nTimeResult *= ( tmp_buf[ i ] - '0' );
  11.         nSumResult += ( tmp_buf[ i ] - '0' );
  12.     }

  13.     return ( ( nTimeResult == 362880 ) && ( nSumResult == 45 ) );
  14. }

  15. int main()
  16. {
  17.     for ( int i = 123; i <= 329; i++ )
  18.     {
  19.         if ( judge( i, i * 2, i * 3 ) )
  20.         {
  21.             printf( "%d, %d, %d \n", i, i * 2, i * 3 );
  22.         }
  23.     }
  24.     return 0;
  25. }
复制代码


反正能找到四组正确结果,呵呵。

论坛徽章:
0
17 [报告]
发表于 2009-04-28 09:53 |只看该作者
原帖由 liaohuangen 于 2009-4-7 21:22 发表
我觉得这个方法最好!!!虽然有点投机...但效率最高....
你不是要1:2:3吗???
可以这样:
(1:2:3)*1=(1:2:3)
(1:2:3)*2=(2:4:6)
(1:2:3)*3=(3:6:9)
(1:2:3)*4=(4:8:12)
在实际中真要遇到这样的情况...我想这 ...


确实是个思路,(1:2:3)*n选择n在100~300之间,设C(m,n)表示从n个数里取出m个数的所有取法,则1,... ,9这些数字了分成三组的分法有:C(3,9)*C(3,6)*C(3,3) = 84 , 但n在100~300之间,所以,n 的取法共有:2*C(2,8 ) = 14 ,即百位数是1或2的取法,同时3位数中不能有重复的位数,设百位数为k(k = 1 or 2) , 十位数为 x ,个位数为 y , 则:
                          (k*100+x*10+y) = n ,and,
                          (2x /10)/k != 1 ,
                          (2x%10)/k != 1 ,
                          (3x /10)/k != 1 ,
                          (3x%10)/k != 1 ,
                          按这个约束从14种取法中找到x ,确定x后再按下面约束找到y ,
                          (2y /10)/k != 1 ,
                          (2y%10)/k != 1 ,
                          (3y /10)/k != 1 ,
                          (3y%10)/k != 1 ,
                          (2y /10)/x != 1 ,
                          (2y%10)/x != 1 ,
                          (3y /10)/x != 1 ,
                          (3y%10)/x != 1 ,(想了想,(3y%10)% != 0改成(3y%10)/x != 1,上面如同)

如此多的约束,算下来就几个取法了,这种题目用程序来算已经没有意义,可以把问题扩展出去,但我还是觉得这样做只是浪费时间,如果没有遇到实际情况,这个没有多少研究的意义...

[ 本帖最后由 qsc555 于 2009-4-28 10:06 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-04-28 14:22 |只看该作者
直接上暴力~

论坛徽章:
0
19 [报告]
发表于 2009-04-28 17:33 |只看该作者
原帖由 SirFang 于 2009-4-7 11:58 发表


for(int digit = 0; digit < 658;digit *=2) ...

for(int digit = 0; digit < 658;digit *=2)??
这个可是死循环呀?
帮你改过来,:-)你这后面是digit +=2
这计算下,你的次数也得329次,但LZ的才206次,
这减半之说如何来呢?

论坛徽章:
0
20 [报告]
发表于 2009-05-06 21:56 |只看该作者

回复 #15 youshuang 的帖子

确实是个好方法,赞一个!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP