原始问题描述:

对于给定的正整数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();//出栈

}

}

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

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

  1. python计算整数各位数字之和_编写函数,计算一个整数各位数字之和

    话题:编写函数,计算一个整数各位数字之和回答:这个关键是怎么得到每位数, #includeint sum_num(int num)//得到每位数的函数 { int sum=0; while(num10 ...

  2. 数组两个整数相加 c语言,作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)...

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  3. C语言计算一个整数的位数

    C语言计算一个整数的位数 只需要设计一个计时器,因为C语言中除法只留下整数部分,所以可以拿数字/10:数字位数即为循环次数,待n为个位时n/10=0,然后循环结束. #include<stdio ...

  4. 算法训练 - 阿尔法乘积 计算一个整数的阿尔法乘积。对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身;否则的话,x的阿 尔法乘积就等于它的各位非0

    问题描述 计算一个整数的阿尔法乘积.对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身:否则的话,x的阿 尔法乘积就等于它的各位非0的数字相乘所得到的那 ...

  5. Java黑皮书课后题第6章:*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n)

    6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和.使用下面的方法头:public static int sumDigits(long n) 题目 题目概述 槽点 代码 运行示例 ...

  6. 写一个函数,计算一个整数数组的平均值

    写一个函数,计算一个整数数组的平均值 public static void main(String[] args){//定义一个数组int[] array=new int[];//通过循环对数组赋值f ...

  7. Java黑皮书课后题第5章:*5.16(找出一个整数的因子)编写程序,读入一个整数,然后以升序显示它的所有最小因子。例如,若输入的整数是120,那么输出就应该是:2、2、2、3、5

    *5.16(找出一个整数的因子)编写程序,读入一个整数,然后以升序显示它的所有最小因子.例如,若输入的整数是120,那么输出就应该是:2.2.2.3.5 题目 题目概述 代码:[点击这里快速跳转推荐方 ...

  8. 序列求和:问题描述 求1+2+3+...+n的值。 输入格式 输入包括一个整数n。 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值。

    题目: 问题描述 求1+2+3+-+n的值. 输入格式 输入包括一个整数n. 输出格式 输出一行,包括一个整数,表示1+2+3+-+n的值. 样例输入 4 样例输出 10 样例输入 100 样例输出 ...

  9. C语言--用二分法快速计算指定整数的整数平方根

    题目:给定一个正整数,小于2的63次方.要求不是用pow,sqrt等算法库函数,快速计算指定正整数的平方根(保留整数部分). 普通办法是从1开始计算平方数,如果给定的正整数在相邻两个平方数之间,那么 ...

最新文章

  1. CSS中实现DIV容器垂直居中
  2. AIR工程中发生This application cannot be run. (Error: invalid application identifier) 错误
  3. oracle 填入编号,sql – 带填充模式的Oracle to_char格式编号(FM0000)
  4. android手机连接无线路由器上网设置,怎样用手机设置无线路由器上网?
  5. 千万别强制停机!我嘴都气歪了!
  6. java 获取当前方法的名称_Java中获取当前函数名
  7. 如何在Windows 10上安装MySQL数据库服务器8.0.19
  8. android 动画xml属性总结
  9. 配置springMVC
  10. Atitit js es5 es6新特性 attilax总结
  11. OpenCV-图像处理(30、轮廓周围绘制矩形框和圆形框)
  12. 「超级右键」Mac上最强的右键菜单工具,让你效率飞起!
  13. 从零开始搭建ROS智能小车@sp头子
  14. 21个奇葩注释,程序员看了都点赞
  15. 【sv】getenv 【import “DPI-C“】
  16. 【企业高管】CIO vs CEO:主要区别是什么?
  17. 使用Python将图片变成铅笔素描
  18. AD软件中的pcbdoc、schdoc等类似一些文件的图标变成了白板解决办法
  19. 信息安全精彩视频分享-一张纸入侵企业号星舰
  20. z690和z590的区别

热门文章

  1. [渝粤教育] 温州医科大学 医用高等数学 参考 资料
  2. 【渝粤教育】国家开放大学2018年春季 8638-22T薪酬制度与薪酬管理 参考试题
  3. cnn 一维时序数据_蚂蚁集团智能监控的时序异常检测:基于 CNN 神经网络的异常检测...
  4. ajax div 赋值重新渲染_优化向:单页应用多路由预渲染指南
  5. html在screen检索屏幕分辨率,Electron开发之screen模块-根据屏幕分辨率设置窗口大小...
  6. mysql 去掉默认约束_06. 默认约束-创建、添加和删除
  7. 用JIRA管理你的项目
  8. 洛谷 P1939 【模板】矩阵加速(数列)
  9. iOS安装CocoaPods的详细步骤
  10. poj1419 Graph Coloring 最大独立集(最大团)