整数因子分解c语言递归,整数因子分解:计算一个整数所有的分解式(递归实现)...

原始问题描述:

对于给定的正整数n,计算n有多少种不同的分解式。

例如,当n=12时,有8种不同的分解式:

12=12,

12=6×2,

12=4×3,

12=3×4,

12=3×2×2,

12=2×6,

12=2×3×2 ,

12=2×2×3

对n的每个因子递归搜索,代码如下:

void solve (int n)

{

if (n==1)

total++;

else

for (int i=2; i<=n; i++)

if (n%i==0)

solve (n/i);

}

扩展问题一:能否输出各种具体的分解表达式?

思路:可以设置一个栈,如果是因子,则将这个因子压入栈中,递归到因子为1时分解完毕,将整个栈中元素输出。一次递归结束后将栈顶的元素弹出(本例中用的vector容器模拟栈)。代码如下:

void solve(int n)

{

if (n == 1)

{

total++;

print_vector(ivec);//输出栈中的元素

}

else

for (int i = 2; i <= n; i++)

if (n % i == 0)

{

//如果i是n的因子,则将i压入栈

ivec.push_back(i);

solve(n / i);

ivec.pop_back();//出栈

}

}

扩展问题二:能否输出不重复的分解表达式?

第一种思路:经过多次试验发现,如果递归结束时,模拟栈中的元素是无序的,则本次分解一定重复。以12为例,有3种情况为:2×2×3、2×3×2、3×2×2,后两种之所以重复,是因为它们都是无序的,因此,在上问题一的基础上,只须在输出之前判断一下模拟栈中的元素是否有序便可,若序时,才进行输出。代码如下:

void solve(int n)

{

if (n == 1)

{

total++;

if (isOrderVector(ivec))//只有有序时,才输出

print_vector(ivec);//输出栈中的元素

}

else

for (int i = 2; i <= n; i++)

if (n % i == 0)

{

//如果i是n的因子,则将i压入栈

ivec.push_back(i);

solve(n / i);

ivec.pop_back();//出栈

}

}

其中判断模拟栈是否为有序的代码如下:

bool isOrderVector(vector & ivec)

{

assert(ivec.size() > 0);

for (vector::iterator i = ivec.begin() + 1; i != ivec.end(); i++)

if (*i < *(i-1))

return false;

return true;

}

问题二的进一步优化:其实slove()函数内层循环中i没有必要循环到n,只须要循环到sqrt(n)便可,当然,需要再补上缺失的一种情况:当i为n时,代码如下:

void solve(int n)

{

……

else

{

for (int i = 2; i <= sqrt(n); i++)

{

if (n % i == 0)

{

//如果i是n的因子,则将i压入栈

ivec.push_back(i);

solve(n / i);

ivec.pop_back();//出栈

}

}

{

ivec.push_back(n);

slove(1);

ivec.pop_back();

}

}

}

第二种思路[章磊同学提供]:

既然为了保持模拟栈中元素的顺序,那每次i入栈之前先同栈顶元素进行比较,如果i大于栈顶元素,则不入栈,这种方法更简洁,代码如下:

void solve(int n)

{

if (n == 1)

{

total++;

print_vector(ivec);//输出栈中的元素

}

else

for (int i = 2; i <= n; i++)

if (n % i == 0)

{

//若栈不为空,且i比栈顶元素小,说明

//再压栈己没有意义,直接结束本次循环。

if ((ivec.size() > 0) && i < ivec[ivec.size()-1])

continue;

//如果i是n的因子,则将i压入栈

ivec.push_back(i);

solve(n / i);

ivec.pop_back();//出栈

}

}

参考资料:北京科技大学 罗熊 算法设计与分析 第三章课件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat 部署了web项目中文乱码

本地Tomcat 启动&#xff0c;网页端的中文传到后台显示乱码。 查询前段已经设置了 UTF-8格式&#xff0c; 后台收到中文的依然是乱码&#xff0c;原来是Tomcat的配置问题。 修改Tomcat的配置文件server.xml &#xff0c;添加一个属性 URIEncoding"UTF-8"&#xff0c;…

电脑基础c语言,C语言经验: 如何从零基础学习C语言?

C语言是面向过程的&#xff0c;而C 是面向对象的C和C 之间的区别:C是一种结构化语言&#xff0c;其重点是算法和数据结构. 在C程序设计中&#xff0c;首先要考虑的是如何通过过程来处理输入(或环境条件)以获得输出(或实现过程(事务)控制).C &#xff0c;首先要考虑的是如何构建…

Android布局动态化,一种基于堆积木思想的卡片式Android动态布局方法与流程

本发明涉及android界面布局&#xff0c;特别是一种基于堆积木思想的卡片式Android动态布局方法。背景技术&#xff1a;在Android流行的今天&#xff0c;android App在生活中使用日益广泛&#xff0c;相对PC&#xff0c;手机由于界面的尺寸的限制&#xff0c;手机的UI设计和布局…

java cpu_Java High CPU故障排除指南–第1部分

java cpu本文是该系列的第1部分&#xff0c;它将为您提供有关如何进行故障排除和识别Java高CPU问题根本原因的综合指南。 本指南也适用于独立的Java程序&#xff0c;但旨在帮助涉及Java EE企业日常生产支持的个人。 它还将包括最常见的高级CPU问题列表以及高级解决方案。 生产…

android:ellipsize=end 不起作用,android:ellipsize=end 失效或者 相关的Bug

其实这文章有点傻逼。相关的问题TextView android:ellipsize“end”超出一个字符时不显示…的解决http://www.pocketdigi.com/20140122/1261.html上面我到没有遇到过。但是我遇到的更神奇。就是在使用android:ellipsize“end”正常的情况下这个属性。该textView的文本就不能加入…

适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...

该博客将说明如何使用Docker创建部署在多个主机上的多容器应用程序。 这将使用Docker Machine&#xff0c;Swarm和Compose实现。 是的&#xff0c;所有这三个工具一起使此博客更加有趣&#xff01; 该图说明了关键组件&#xff1a; Docker Machine用于配置多个Docker主机 …

android 手机工具箱,Android工具箱下载

安卓工具箱专业版是款集所有功能于一身的工具箱&#xff01;包括硬件和软件和工具&#xff0c;您的手机使用的信息。非常容易使用&#xff0c;具有非常用户友好的用户界面。 主要功能&#xff1a; 1。硬件信息&#xff1a;CPU核心&#xff0c;CPU类型&#xff0c;内存信息&…

日记

时间&#xff1a;18年4月15日下午将近2点 地点&#xff1a;北京昌平区 本来是在github上写技术博客。突然听到楼下小朋友的嘻戏声&#xff0c;也是不止一次让这种声音勾起了我的回忆。 这种声音就仿佛是自己小时候和小朋友玩一般&#xff0c;但是&#xff0c;我现在却是在北京。…

一键复制android代码,兼容安卓和ios实现一键复制内容到剪切板

js兼容安卓和ios实现粘贴板一键复制color: #000;background: #fff;overflow-y: scroll;-webkit-text-size-adjust: 100%;-ms-text-size-adjust: 100%;}html*{outline:0;-webkit-text-size-adjust: none;-webkit-tap-highlight-color: transparent}*{margin:0;padding:0}.conten…

adf时间作用域_ADF:在任务流终结器中支持bean作用域

adf时间作用域介绍 当我们需要在任务流消失之前做一些最终工作&#xff08;干净的资源&#xff0c;紧密的连接等&#xff09;时&#xff0c;这是使用任务流终结器的非常普遍的建议做法。 和往常一样&#xff0c;我们使用在任务流中声明的托管bean。 托管Bean可以具有不同的范围…

贴一段自动编译java,并混淆编译的代码

刚写的一个自动编译、混淆、打包jar的代码&#xff0c;做个记录 用到的NuGet&#xff1a; <?xml version"1.0" encoding"utf-8"?> <packages><package id"DotNetZip" version"1.10.1" targetFramework"net45&qu…

android jpush json,发送了正确的JPush json却报1002

问题描述&#xff1a;调用jPushClient.sendPush前将PushPayload转换成JSON串打印到日志上&#xff0c;检查日志上的JSON发现没有错误&#xff0c;但是response返回报{"error": {"message": "Missing parameter", "code": 1002}}, jpus…

Drools:fireAllRules,fireUntilHalt和Timers内部代码清理的详细说明

在六月&#xff0c;我们在博客上发布了一个新的内部状态机&#xff0c;用于管理用户&#xff0c;计时器和引擎线程之间的交互。 现在&#xff0c;我们对该代码进行了另一次大的内部清理&#xff0c;以使其更易于阅读和理解。 如前所述&#xff0c;所有操作&#xff08;插入&am…

BZOJ 4517 组合数+错排

思路&#xff1a; 预处理错排 然后C(n,m)*s[n-m-1]就是答案了 特判n-m-1<0 //By SiriusRen #include <cstdio> using namespace std; #define int long long const int mod1000000007,N1000050; int cases,n,m,fac[N],s[N]; int pow(int x,int y){int res1;while(y){i…

鸿蒙os下载到电脑上,鸿蒙系统pc版下载2.0

鸿蒙系统pc版2.0是华为最新打造的系统&#xff0c;采用分布式操作系统&#xff0c;可以在华为各种设备上使用。华为鸿蒙2.0系统pc版可以适应全新的芯片&#xff0c;打造个性化的操作习惯&#xff0c;可以让用户使用更舒适&#xff0c;功能更强大。它是一个面向全场景的开源分布…

nodejs+vue+ElementUi房屋房产销售预约看房系统bqv00

完成房产销售系统&#xff0c;对房源的信息、用户信息及各种资料进行收集和科学的管理&#xff0c;该系统的功能基本可以满足当前市面上的小型房产企业对于房产销售的基本要求&#xff0c;收集各个地区的房源信息并进行分类管理&#xff0c;用户通过注册账号登录网站查询房源信…

16.条件控制语句

11.关于条件控制和语句&#xff0c;流程控制语句if...else 1)语法&#xff1a; 第一种结构&#xff1a; if(boolean表达式){ java语句&#xff1b; } 第二种结构&#xff1a; if(boolean表达式){ java语句; }else{ java语句; } 第三种结构&#xff1a; if(boolean表达式){ java…

使用Chameleon,Shrinkwrap,Drone / Graphene与Arquillian进行Java EE集成测试

从我以前的帖子继续在这里 &#xff0c;我想我已经了解了Java EE和也的Arquillian&#xff0c;并测试了一些新的&#xff08;和令人兴奋的&#xff09;事&#xff0c;我想与大家分享。 但是&#xff0c;在开始之前&#xff0c;我想首先请您注意以下几点&#xff08;这些纯粹是…

mysql配置以及性能优化(转)

MySQL配置文件my.cnf中文详解&#xff0c;附mysql性能优化方法分享 Mysql参数优化对于新手来讲&#xff0c;是比较难懂的东西&#xff0c;其实这个参数优化&#xff0c;是个很复杂的东西&#xff0c;对于不同的网站&#xff0c;及其在线量&#xff0c;访问量&#xff0c;帖子数…

android+完美的列表,android完美讲义.pdf

android完美讲义王骋QQPhoneMail• 感谢我的同事&#xff0c;陈操(横拓开源技术副总)&#xff0c;在他提供的资料乊上做了迚一步总结提炼。• 参考资料android sdk开发文档&#xff0c;IBM开发者&#xff0c;同时也感谢网络上的各位大侠• 这个ppt更多是总结&#xff0c;侧重亍…