输入一个正数 n,输出所有和为 n 连续正数序列。

来源:互联网 发布:荣耀盒子推荐软件 编辑:程序博客网 时间:2024/03/29 17:27

1、输入一个正数 n,输出所有和为 n 连续正数序列
        例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以输出 3 个连续序列 1-5、4-6 和 7-8。
        分析:我们用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为 1,big初始化为 2。如果从small到big的序列的和大于n的话,我们向右移动small,相当于从序列中去掉较小的数字。如果从small到big的序列的和小于n的话,我们向右移动big,相当于向序列中添加big的下一个数字。一直到small等于(1+n)/2,因为序列至少要有两个数字。
        基于这个思路,我们可以写出如下代码:

#include "stdafx.h"#include <iostream>#include <stack>#include <assert.h>using namespace std;//打印连续序列void PrintSequence(int small,int big){for (int i=small;i<big;i++){cout<<i<<"-";}cout<<big<<endl;}//寻找和为n的连续序列void FindContinuesSequence(int n){int small=1;int big=2;int middle=(1+n)/2;int sum=small+big;while(small<middle){//sum==n,直接输出序列if(sum==n)PrintSequence(small,big);//sum>n,small向右移,直至sum<=nwhile(sum>n){sum-=small;small++;if(sum==n)    PrintSequence(small,big);}//sum<n,big向右移big++;sum+=big;}}int main(){FindContinuesSequence(15);    return 0;}

2、输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.。

使用回溯算法,代码如下:

#include "stdafx.h"#include "stdlib.h"#include <iostream.h>#include <string.h>#define N 1000int a[N];  //辅助数组,用来存储满足条件的组合int c=0, n=20, m=30; void work(int sum, int cc){//和等于m,递归终止,输出组合if(sum == m)  { for(int i = 0; i < c; ++i)printf("%d ", a[i]);printf("\n");return;}//数列从1到n遍历一遍for(int i = cc; i <= n; ++i)  {//和大于m,此次递归终止if(sum + i > m)  return;//和小于m,继续递归if(sum + i <= m) {a[c++] = i;work(sum + i, i + 1);--c;   //回溯控制}}}int main(){work(0, 1); //初始条件(和初始值为0,数列起始值为1)return 0;}