找回密码
 注册
Simdroid-非首页
查看: 137|回复: 5

【讨论】找出一个七位数,它的各位数字各不相同,它还可被自己的每一位数整除!

[复制链接]
发表于 2011-1-8 13:33:40 | 显示全部楼层 |阅读模式 来自 北京西城
本帖最后由 qibbxxt 于 2011-1-8 13:37 编辑

来自:http://www.matlabsky.com/thread-12684-1-1.html
看到技术论坛上面的这个帖子,我也写了一个程序,觉得大家可以讨论一下,大家可以用不同语言来测试速度
  1. clear;clc;close all
  2. tic
  3. num=nchoosek(1:9,7);
  4. g=@(x)perms(num(x,:))*10.^(0:6)';
  5. f=@(x){feval(@(y,z)y(z),g(x),all(~bsxfun(@mod,g(x),num(x,:)),2))};
  6. num1=cell2mat(accumarray((1:size(num))',(1:size(num))',[],f));
  7. toc
复制代码

  1. Elapsed time is 0.163726 seconds.
复制代码
找出105组解
而且程序显示都是由1 2 3 6 7 8 9组成的,也许可以从数学的角度论证,节省程序没有必要的搜索

评分

1

查看全部评分

发表于 2011-1-8 15:06:01 | 显示全部楼层 来自 北京
Simdroid开发平台
老弟代码很给力!呵呵
就程序的易读性而言,最后可以不用accumarray,这里用accumarray,我想老弟是想体现accumarray在某些方面和arrayfun的等同性吧,最后完全可以用

  1. cell2mat(arrayfun(f,(1:size(num))'));
复制代码
或者

  1. num2 = cell(length(num),1);
  2. for kk = 1:length(num)
  3. temp = f(kk);
  4. num2{kk} =temp{1};
  5. end
  6. num2 = cell2mat(num2);
复制代码
这样易读,但是比较繁琐。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-1-8 17:26:39 | 显示全部楼层 来自 北京西城
2# rocwoods
谢谢老兄
恩,测试了一下,arrayfun和accumarray在这个问题上的效率差不多
一对一的操作,accumarray的效率优势还是体现不出来
在这种情况下,还不如用arrayfun,
一方面匿名函数好构造一些,另一方面易读性也强一些
回复 不支持

使用道具 举报

发表于 2011-1-8 21:27:29 | 显示全部楼层 来自 湖南湘潭
这道题很熟悉,一查在MathCad板块果然出现过:
http://forum.simwe.com/viewthrea ... =%C6%DF%CE%BB%CA%FD
qibbxxyt版主也给过一次代码。不过这一次确实更给力。

关于数字的题目2010年在Mathematic板块火了好一阵子,
有兴趣的话大家也可以看看MatheMatic/ProjEuler板块。

个人认为更有挑战性的题目在于下面的这道非线性整数规划,
若按穷举法(把可能的整数组合全部列出)的方法做循环的次数可能要达14^63,呵呵:
http://forum.simwe.com/thread-966832-1-1.html

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-1-8 22:02:00 | 显示全部楼层 来自 北京西城
4# lin2009
恩,今天看到这个题目的时候,就觉得好像写过这个题的代码
找了半天,没有找到,谢谢lin兄
回复 不支持

使用道具 举报

 楼主| 发表于 2011-1-9 07:00:06 | 显示全部楼层 来自 北京西城
本帖最后由 qibbxxt 于 2011-1-9 21:50 编辑

从算法的角度分析,用排除法去考虑:
1.这组数字里面不能包含5:如果包含5,5必须在个位,那么此数就不能被2,4,6,8整出,那么2,4,6,8就不 在这组数字中,那么数字的个数就不足7个。
2.这组数字组成的数必然能被3整除,若不能,则,3,6,9不在其中,数字个数不足7.
3.根据2,7个数的个位数字之和必然能被3整除,剩下的数字1,2,3,4,6,7,8,9之和是40,去掉一个数还能被3整除,这个数字只能是1,4,7中的一个,若去掉1或者7,该数均不能被9整除,那样9也要去掉,所以只能去掉4,剩下的数组之和是36.
4.这样一来这组数组就由1,2,3,6,7,8,9组成
5.考虑到偶数的原因,在进行过滤
那么程序如下:
  1. clear;clc;close all
  2. tic
  3. g=feval(@(x)x(mod(x(:,1),2)==0,:),perms([1:3,6:9]))*10.^(0:6)';
  4. f=feval(@(y,z)y(z),g,all(~bsxfun(@mod,g,[1:3,6:9]),2));
  5. toc
复制代码
  1. Elapsed time is 0.003474 seconds.
复制代码
考虑易读性
  1. tic
  2. g=perms([1:3,6:9])*10.^(0:6)';
  3. g(mod(g(:,1),2)~=0,:)=[];
  4. f=all(~bsxfun(@mod,g,[1:3,6:9]),2);
  5. res=g(f);
  6. toc
复制代码
  1. Elapsed time is 0.003325 seconds.
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

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

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-28 23:42 , Processed in 0.049606 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表