整数拆分成一个非减整数序列的和,求出所有的序列
来源:互联网 发布:便笺元数据 编辑:程序博客网 时间:2024/06/05 09:29
在网上经常看到这样的类似题:5=1+1+1+1+1,5=1+1+1+2,5=1+1+3。。。一个整数可以写成一些整数的和的形式,列出所有的整数序列,序列从小到大排列。
本题可以采用迭代的方法来解决。假设要考察的整数为N,某个满足要求的序列为A1,A2,,,Ai.(i<=N, Aj>=1,i<=j<=i),有N=A1+A2+...Ai。
在迭代中,假设当前的序列为A1,A2,,,,Ak(Ak<=N,1<=k<=i),此序列中最大的整数为curMax=Ak,当前序列的和为curSum=A1+A2+...Ak.
如果curSum==N,则当前序列为满足要求的序列,输出A1,A2,,,Ak.否则,从curMax开始每次加1,向或不向序列中增加curMax整数,直到curSum<=N.进行迭代。具体代码如下:
#include <iostream>
using namespace std;
const int N=10;
int index; //数组元素的指针,表示当前序列中最后一个元素的位置
/**
a为存储结果的数组,curSum为当前结果中的和,curMax为当前结果中最大的整数
*/
void f(int* a,int curSum,int curMax)
{
if(curSum == N)
{
cout<<N<<"="<<a[1];
for(int j=2;j<=index;j++)
{
cout<<"+"<<a[j];
}
cout<<endl;
}
for(int i=curMax;i+curSum <=N;i++)
{
a[++index]=i; //向序列中加入i
f(a,curSum+i,i); //进行迭代
--index; //不向序列中加入i
}
}
int main()
{
int* a;
a=new int[N+1];
index=0;
memset(a,0,N+1);
f(a,0,1);
return 0;
}
- 整数拆分成一个非减整数序列的和,求出所有的序列
- 输入一个整数,输出所有可能的整数序列,使得序列中的整数之和等于输入的整数
- 【c语言】输入一组整数,求出最大子序列的和
- 一组整数中求出最大整数序列
- 输入一个整数,求出它的所有因子
- 输入一个整数,求出它的所有因子
- 求一个整数序列的和的最大子串
- 求出和为固定值的所有连续整数
- 和为s的连续整数序列
- 和为sum的连续整数序列
- 整数分解成多个连续的整数序列
- 求一个整数序列的最大子序列和(编程珠玑第八章)
- 求整数序列的最大子序列和
- 给定一个整数序列,请找出这个整数序列的中间数的值。
- 输入一个整数和一棵二元树。求出从根节点到叶节点的路径长度中与输入整数相等的所有路径。
- 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数
- 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。
- 输入整数序列,最小的和第一个数对换,最大的和最后一个数对换
- 正则表达式的最底层
- 让你的代码变的更加强大(Making your C++ code robust)
- 抄了一个简短的Tiny Web服务器
- Y86 Simulatos
- 推荐一个很实用的软件Prism
- 整数拆分成一个非减整数序列的和,求出所有的序列
- 编译curl静态库的方法
- POJ3009DFS
- response.setHeader参数、用法的介绍
- 算法概述
- 热备基础知识
- Heartbeat基本介绍
- 精灵模板啊 ~~
- VMware+Workstation+7.1.4注册机