『每日一题 2012-02-13』整数划分问题
来源:互联网 发布:国外文献数据库 编辑:程序博客网 时间:2024/06/16 00:40
问题描述:
对于正整数n=6,可以分划为: 6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 2+2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+1+1+1 现在的问题是,对于给定的正整数n,编写算法打印所有划分。
算法实现:
可以求出具体划分方式
#include <stdio.h>#define MAX 100int d[MAX]; /* 用来存放分解结果 */void decompose(int m, int n, int k); /* 将m分解为不大于n的组成数,k>=0是项号 */int main(){ int n; printf("input n:"); scanf("%d", &n);decompose(n, n, 0); return 0;}void decompose(int m, int n,int k){ int i; if (m == 0) { /* 当m为0时,得到一个划分,将分解结果输出 */ printf("%d", d[0]); for (i=1; i<k; i++) printf("+%d", d[i]); for (i=1; i< k; i++) /* for + if 处理输出格式 */ if (d[i] != 1) break;if (i == k) printf("\n");elseprintf(", ");return; } for (i=(m<n?m:n); i>0; i--) { /* 一次分解的几种可能分法 */ if (i < n) d[k] = i; else d[k] = n; decompose(m-d[k], d[k], k+1); /* 递归调用使分解继续下去,直到得到一个划分 */ }}
求出划分个数:
#include <stdio.h>int split(int n,int m);int main(){int n;printf("Please input an integer:\n");scanf("%d",&n);int sum=split(n,n);printf("%d\n",sum);return 0;}int split(int n,int m){if (1==n || 1==m){return 1;}if (n==m){return 1+split(n,m-1);}if (m>n){split(n,n);}else{return split(n,m-1)+split(n-m,m);}}
更多了解,可以点击:
http://baike.baidu.com/view/4491942.htm
http://www.programfan.com/acm/show.asp?qid=57
- 『每日一题 2012-02-13』整数划分问题
- 『每日一题 2012-02-10』猴子选大王问题 C语言实现
- 整数划分(一)
- 经典问题一.(插入乘号的整数划分)整数划分(四) nyoj 746
- 整数划分问题
- 整数划分的问题
- 整数划分问题
- [算法]整数划分问题
- 整数划分问题
- 【转】整数划分问题
- 整数划分问题解析
- 整数划分问题
- 整数划分问题
- 整数划分问题
- 整数划分问题
- 整数划分问题
- 整数划分问题 POJ1664
- 整数划分问题
- li中嵌套ul在ie6,7下的bug
- c++开发python扩展模块:cannot open file ‘python25_d.lib’解决办法
- HDU 3560 Graph’s Cycle Component 【并查集】
- 题目:一个5位数,判断它是不是回文数。
- Win32的基本概念和c++的重要性质
- 『每日一题 2012-02-13』整数划分问题
- UBUNTU下Apache2安装
- RelativeLayout常用属性介绍
- Android的xml文件中@、@android:type、@*、?、@+的含义和区别
- GD Star Rating的widget停留在 loading...或a WordPress rating system
- netbean 和ireport有什么不同么?
- android 多点触摸 实现图片缩放 Image Zoom
- 在EditText中开启软键盘的"Done"按钮
- eclipse插件