标签:
//博主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