码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-05 14:25:39      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

//博主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;
}

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

标签:

原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/45501877

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!