求正整数n的分解式——通过题目来了解和加深递归思想
2011-10-21 20:12
483 查看
刚开始,我们学习递归思想的时候可能都会以求N的阶乘为例子。这是一个很简单的递归例子,可以很直白地展现递归的思想。可是我们对递归的理解往往会限于这种简单的模式中,很难跳出来。当我们遇到稍微难点的问题,我们可能又无从下手了。我深有感触。下面是一个比较好的例子,做出后,对递归的了解会更加深刻。
题目:对于给定的正整数n,编程计算n共有多少种不同的分解式。
Example:12=2*2*3=2*3*2=2*6=3*4=…
解题代码:
#include<stdio.h>
#include<stdlib.h>
//判断n是否为质数, 如果是质数则表示不可再分解,否则可以继续分解
bool zhishu(int n)
{
for(int i = 2; i <= n/2; i++)
{
if(0 == n % i)return false;
}
return true;
}
//分解函数,递归实现
//求整数N的分解式个数num可以这么理解:
//分成两部分,一部分是for(int i = 2; i <= n/2; i++)if(0==n%i)num++;
//另一部分为,当(n%i==0)时, nx = n/i; for(int j = 2; j < nx/2; j++)if(0==nx%j)num++;
//Example:n = 12时
//n0 = 12 -> 12/2=6; 12/3=4; 12/4=3; 12/6=2;
//n1 = 6 -> 6/2=3;
//n2 = 4 -> 4/2=2;
//n3 = 6 -> 6/2=3;
//共有7种情况
int parts(int n, int m)
{
int t = 2; //保证每个递归子式都能够从2开始检测
if(zhishu(n))return 0;
if(m <= n/2 && n%m == 0)return 1 + parts(n/m, t) + parts(n, m+1);
if(0 != n%m && m <= n/2)return parts(n,m+1);
return 0;
}
int main()
{
int n;
printf("请输入正整数n:");
scanf("%d", &n);
int num = 0;
int m = 2;
num = parts(n,m);
printf("%d的分解式个数为%d: ", n, num);
system("pause");
}
题目:对于给定的正整数n,编程计算n共有多少种不同的分解式。
Example:12=2*2*3=2*3*2=2*6=3*4=…
解题代码:
#include<stdio.h>
#include<stdlib.h>
//判断n是否为质数, 如果是质数则表示不可再分解,否则可以继续分解
bool zhishu(int n)
{
for(int i = 2; i <= n/2; i++)
{
if(0 == n % i)return false;
}
return true;
}
//分解函数,递归实现
//求整数N的分解式个数num可以这么理解:
//分成两部分,一部分是for(int i = 2; i <= n/2; i++)if(0==n%i)num++;
//另一部分为,当(n%i==0)时, nx = n/i; for(int j = 2; j < nx/2; j++)if(0==nx%j)num++;
//Example:n = 12时
//n0 = 12 -> 12/2=6; 12/3=4; 12/4=3; 12/6=2;
//n1 = 6 -> 6/2=3;
//n2 = 4 -> 4/2=2;
//n3 = 6 -> 6/2=3;
//共有7种情况
int parts(int n, int m)
{
int t = 2; //保证每个递归子式都能够从2开始检测
if(zhishu(n))return 0;
if(m <= n/2 && n%m == 0)return 1 + parts(n/m, t) + parts(n, m+1);
if(0 != n%m && m <= n/2)return parts(n,m+1);
return 0;
}
int main()
{
int n;
printf("请输入正整数n:");
scanf("%d", &n);
int num = 0;
int m = 2;
num = parts(n,m);
printf("%d的分解式个数为%d: ", n, num);
system("pause");
}
相关文章推荐
- 练习 4-12 运用 printd 函数的设计思想编写一个递归版本的 itoa 函数,即通过递归 调用把整数转换为字符串
- 整数因子分解:计算一个整数所有的分解式(递归实现)
- 递归思想实现大数问题(打印1到n位最大整数)
- 通过递归调用把整数转换成字符
- 运用递归思想求100以内整数的和
- 算法篇-1-递归思想-整数划分&Fibonacci&Ackerman&Permutation&Hanoi
- 一道递归思想的排列组合题目
- 通过java递归思想实现以树形方式展现出该目录中的所有子目录和文件
- 通过河内之塔问题深入理解递归思想
- 通过java递归思想实现以树形方式展现出该目录中的所有子目录和文件
- 整数划分问题(python)--递归 and 动态规划(m个盘里放n个苹果思想类似)
- NYOJ90-整数划分,经典递归思想~~
- 递归思想实现大数问题(打印1到n位最大整数)(JAVA代码)
- NYOJ 题目176整数划分(二)(递归)
- 整数分解为若干项之和——递归思想
- JAVA--第十周作业编写之一个Teacher类负责给出算术题目,随机给出两个整数并进行运算,并判断回答者的答案是否正确;编写一个GUI类ComputerFrame,回答者可以通过GUI看到题目并给出
- 面试题目-用递归通过单字符输出打印多位的数字
- 2013-11-13 实验之整数划分(递归求解思想,条件判断输出)
- 递归思想实现大数问题(打印1到n位最大整数)
- 【递归经典题目】求整数N的阶乘。