[已解决] 怎么列出将一个整数分解为两个数的乘积的所有可能性

[复制链接]
南川 发表于 2021-9-8 16:34:51
怎么列出将一个整数分解为两个数的乘积的所有可能性

最佳答案


15631202458 发表于 2021-9-10 12:50:52
南川 发表于 2021-9-9 15:19
比如说54,我想把它分解成两个整数的乘积,可能组合有1*54,2*27,3*18,....等等,然后把这些可能列出来 ...

程序验证没有问题,看下下面两种方案耗时对比
  1. m=2^15

  2. numbers=factor(m)
  3. n1=length(numbers);
  4. n=round(length(numbers)/2)
  5. %% 方案1 全部遍历
  6. out={[num2str(m),'*1'];['1*',num2str(m)]};
  7. tic
  8. for i=1:n1
  9.     index=nchoosek(1:n1,i);
  10.     for j=1:nchoosek(n1,i)
  11.         
  12.     out=[out;[num2str(prod(numbers(index(j,:)))),'*',num2str(prod(numbers(~ismember(1:n1,index(j,:)))))]];
  13.     end
  14. end
  15. %去掉重复数据
  16. out = cellfun(@double,unique(cellfun(@char,out,'un',0)),'un',0);
  17. out = cellfun(@char,out,'un',0)
  18. toc


  19. %% 方案2 循环可以减少近一半,但是耗时更长,悲剧
  20. out1={[num2str(m),'*1'];['1*',num2str(m)]};
  21. tic
  22. for i=1:n
  23.     index=nchoosek(1:n1,i);
  24.     for j=1:nchoosek(n1,i)
  25.     out1=[out1;[num2str(prod(numbers(index(j,:)))),'*',num2str(prod(numbers(~ismember(1:n1,index(j,:)))))]];   
  26.     out1=[out1;[num2str(prod(numbers(~ismember(1:n1,index(j,:))))),'*',num2str(prod(numbers(index(j,:))))]];
  27.     end
  28. end
  29. %%去掉重复数据
  30. out1 = cellfun(@double,unique(cellfun(@char,out1,'un',0)),'un',0);
  31. out1 = cellfun(@char,out1,'un',0)
  32. toc
复制代码

9 条回复


15631202458 发表于 2021-9-9 10:12:45
提供个思路啊
1,看下factor函数(质因数)
2.看下下面这个帖子函数实现过程
[url=]https://www.ilovematlab.cn/thread-223075-1-1.html[/url]

南川 发表于 2021-9-9 15:17:28
15631202458 发表于 2021-9-9 10:12
提供个思路啊
1,看下factor函数(质因数)
2.看下下面这个帖子函数实现过程

好的,我试试,我之前有用for循环尝试,但是最后输出只有一个数,无法列出所有可能

南川 发表于 2021-9-9 15:19:56
比如说54,我想把它分解成两个整数的乘积,可能组合有1*54,2*27,3*18,....等等,然后把这些可能列出来

15631202458 发表于 2021-9-10 12:35:55
本帖最后由 15631202458 于 2021-9-10 12:39 编辑
  1. m=54

  2. numbers=factor(m)
  3. n1=length(numbers);
  4. n=round(length(numbers)/2)

  5. out={[num2str(m),'*1'];['1*',num2str(m)]};
  6. for i=1:n1
  7.     index=nchoosek(1:n1,i);
  8.     for j=1:nchoosek(n1,i)
  9.         
  10.     out=[out;[num2str(prod(numbers(index(j,:)))),'*',num2str(prod(numbers(~ismember(1:n1,index(j,:)))))]];
  11.     end
  12. end
  13. %% 去掉重复数据
  14. out = cellfun(@double,unique(cellfun(@char,out,'un',0)),'un',0);
  15. out = cellfun(@char,out,'un',0)
复制代码

15631202458 发表于 2021-9-10 12:50:52
南川 发表于 2021-9-9 15:19
比如说54,我想把它分解成两个整数的乘积,可能组合有1*54,2*27,3*18,....等等,然后把这些可能列出来 ...

程序验证没有问题,看下下面两种方案耗时对比
  1. m=2^15

  2. numbers=factor(m)
  3. n1=length(numbers);
  4. n=round(length(numbers)/2)
  5. %% 方案1 全部遍历
  6. out={[num2str(m),'*1'];['1*',num2str(m)]};
  7. tic
  8. for i=1:n1
  9.     index=nchoosek(1:n1,i);
  10.     for j=1:nchoosek(n1,i)
  11.         
  12.     out=[out;[num2str(prod(numbers(index(j,:)))),'*',num2str(prod(numbers(~ismember(1:n1,index(j,:)))))]];
  13.     end
  14. end
  15. %去掉重复数据
  16. out = cellfun(@double,unique(cellfun(@char,out,'un',0)),'un',0);
  17. out = cellfun(@char,out,'un',0)
  18. toc


  19. %% 方案2 循环可以减少近一半,但是耗时更长,悲剧
  20. out1={[num2str(m),'*1'];['1*',num2str(m)]};
  21. tic
  22. for i=1:n
  23.     index=nchoosek(1:n1,i);
  24.     for j=1:nchoosek(n1,i)
  25.     out1=[out1;[num2str(prod(numbers(index(j,:)))),'*',num2str(prod(numbers(~ismember(1:n1,index(j,:)))))]];   
  26.     out1=[out1;[num2str(prod(numbers(~ismember(1:n1,index(j,:))))),'*',num2str(prod(numbers(index(j,:))))]];
  27.     end
  28. end
  29. %%去掉重复数据
  30. out1 = cellfun(@double,unique(cellfun(@char,out1,'un',0)),'un',0);
  31. out1 = cellfun(@char,out1,'un',0)
  32. toc
复制代码
回复此楼

南川 发表于 2021-9-10 16:15:29

谢谢谢谢,我试一试,学习一下

南川 发表于 2021-9-10 16:16:54
15631202458 发表于 2021-9-10 12:50
程序验证没有问题,看下下面两种方案耗时对比

嗯嗯,好,我都试试看。谢谢

南川 发表于 2021-9-10 16:27:06
15631202458 发表于 2021-9-10 12:50
程序验证没有问题,看下下面两种方案耗时对比

这个是分解成了质因数的乘积,但是我想,能不能做到就是不一定是质数,比如说我也可以将它分解成,9×6

15631202458 发表于 2021-9-10 17:15:46
本帖最后由 15631202458 于 2021-9-10 17:20 编辑
南川 发表于 2021-9-10 16:27
这个是分解成了质因数的乘积,但是我想,能不能做到就是不一定是质数,比如说我也可以将它分解成,9×6 ...

你看下结果啊,后面不是合成了吗,9*6=(3*3)*(2*3)
分成质数应该是一个定理吧,或者你也可以自己写个循环,完全不用质因数分解,也能做出来
思路不一样,我的方法是拿质因数进行重新组合,属于间接方法吧.
你这么一说我想起一个直接方法,更简单,我把问题复杂化了
  1. clear;
  2. clc;
  3. m=54
  4. out={};
  5. for i=1:m
  6.     if rem(m/i,1)==0
  7.         out=[out;[num2str(i),'*',num2str(m/i)]]
  8.         pause(0.4)
  9.     end
  10. end
复制代码

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

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表