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

来源:互联网 发布:花儿乐队知乎解散 编辑:程序博客网 时间:2024/04/28 14:42
//博主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