正整数分解问题.
来源:互联网 发布:查看suse linux版本 编辑:程序博客网 时间:2024/05/16 04:41
任何自然数多可以分解成不同的比它更小的正整数之和.
例如:6的分解.
6;
5 1;
4 2; 4 1 1;
3 3; 3 2 1; 3 1 1 1;
2 4; 2 3 1; 2 2 2; 2 2 1 1; 2 1 1 1 1;
1 1 1 1 1 1;
如何统计一个正整数的分解问题了.觉得用分治法最好:
由观察可以知道,一个正整数n可以分解为比它小的(n-1), 1;
而(n-1)同样可以当作n继续再分解成比它更小的正整数.
为此得到如下的递归规律:
p(n) = q(n, m) //m为比n更小的正整数
其中如果:
- if(n == 0 || m == 0) p(n) = 0;
- if(n == 1 || m == 1) p(n) = 1;
- if(n < m) p(n) = q(n , n);
- if(n == m) p(n) = q(n, m) = q(n, m-1) + 1;
- 其余:p(n) = q(n, m) = q(n, m-1) + q(n-m, m); //n次递归后原整数变为n-m了.
#include <stdio.h>
int disassemble(int n,int m)
...{
if(n < 0 || m < 0)
return 0;
if(n == 1 || m == 1)
return 1;
if(n < m)
return disassemble( n, n);
if(n == m)
return disassemble(n, m-1) + 1;
return (disassemble(n, m-1)+disassemble(n-m, m));
}
void main()
...{
int n, m;
int result;
printf("n,m: ");
scanf("%d %d ",&n,&m);
result = disassemble(n, m);
printf("%d ",result);
}
int disassemble(int n,int m)
...{
if(n < 0 || m < 0)
return 0;
if(n == 1 || m == 1)
return 1;
if(n < m)
return disassemble( n, n);
if(n == m)
return disassemble(n, m-1) + 1;
return (disassemble(n, m-1)+disassemble(n-m, m));
}
void main()
...{
int n, m;
int result;
printf("n,m: ");
scanf("%d %d ",&n,&m);
result = disassemble(n, m);
printf("%d ",result);
}
以上仅供参考
- 正整数分解问题.
- 正整数分解使得乘积最大问题
- 正整数分解
- 贪心算法----正整数分解问题 和相同,乘积最大
- 递归 正整数分解
- 将正整数分解质因数
- 将正整数分解质因数
- 正整数质因数分解
- 正整数分解质因数
- 正整数分解质因数(2)
- 正整数分解质因数
- 分解正整数成质因数
- 正整数的加法分解
- 正整数分解质因子
- 分解正整数的质因数
- 正整数分解质因数
- 将正整数分解质因数
- 一个正整数分解质因数。
- abstract class和interface
- 《伤城》之痛
- 反流技术之IE插件技术研究第二部分
- 男子汉的责任!
- Web2.0十大Ajax安全漏洞以及成因
- 正整数分解问题.
- Eclipse 启动运行速度调优
- 一组有关IT公司的笑话
- FrontPage微软延长服务期至2014年1月
- 一组和软件有关的笑话
- Mysql开发中的外键与参照完整性
- 多个存储过程完整实例及调用方法
- 极限编程感悟
- DataGrid控件中模板列的服务器控件,怎么添加事件代码