C++求连续数列之和为S的数组里面所有组合(根据公式S=(x+y)*n/2优美实现)

//博主mingliang37的思想,我后来想明白了,整理了一下. 
#include <iostream>
using namespace std;
//输出所有和为S的连续整正数序列.
//x.......y(这是一个连续序列)
//x+.....+y=S;
//还记得小时候老师要我们做的一道题吗?求1+2+3+...+100=?
//(1+100).100/2=5050.
//所以我们假设这个连续正整数序列是从x开始到y结束,总共有n个数字
//那么S=(x+y)*n/2,且y-x=n-1;
//1----------S=(x+y)*n/2.
//2----------y-x=n-1;

//(2x+n-1)*n/2=S
//2S/n+1-n=2x
//2S+n-n*n=2n*x
//x=(2S+n+n*n)/2n--->这是x序列开始位置,用n(序列长度)来替换x。
//因为x>0,所以2S+n-n*n>0; 
void Grial(int sum)
{
	for(int i=1;i<sum;i++)
		{
			int S=2*sum+i-i*i;//下面的所有推算都是由公式.i是边的长度.
					//2S+n+n*n=2*n*x及x>0得到.
					//边(n)=(2S+n+n*n)%(2*x)==0时表示从x位置开始有整数长度的n可以满足要求.
					//如果!=0则表示该位置不满足要求,i++,继续开始.		
			if(S<0)
				break;

			if(S%(2*i)!=0)
			{
				continue;
			}

			int x=S/(2*i);
			for(int j=0;j<i;j++)
			{
				cout<<x+j<<"  ";
			}
			cout<<endl;	
		}
}
int main()
{
	Grial(100);
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值