您的位置:首页 > 其它

【算法学习-01】 输入一个正数 n,输出所有和为 n 连续正数序列。

2014-11-17 22:19 267 查看
【算法学习】为我记录一些算法的集合,解法不一定是我 自己原创的,但是代码的编写一定是我自己的。如果解法是别人的,一定会注明参考。下面是第一篇。

方案一:区间移动的方案,详细见参考。

例如:n=15,原始区间low=1,high=2,区间和为sum=3。

sum=n,输出;

sum<n,high++,sum+=high;

sum>n,sum-=low,low++;

循环的截止条件是low=midlle/2;

参考1:/article/7799436.html

/*方案1:移动区间,直到区间的低值到(1+n)/2*/
public static void continueValues (int n) {
int low=1;
int high=2;
int middle=(1+n)/2;
int sum=low+high;
while (low<middle) {
if (sum==n) printValues(low, high);
while (sum>n) {
sum-=low;
low++;
if (sum==n) printValues(low, high);
}
high++;
sum+=high;
}

}


方案二:详细见参考2。注意,参考2中认为节的集合在[2,sqrt(n)]。

关键点在于,(m1+(m1+k-1))*k=n*2,求得k,再求m1,

参考2:/article/4891581.html

/*方案2,查找能被2n整除的值,这个值就是k*/
public static void continueValues2(int n) {
for (int i = 2; i <=(int)Math.sqrt(2*n); i++) {
if ((n*2)%i==0) {
int temp=n*2-i*i+i;
if (temp%(2*i)==0) {
int low=temp/(i*2);
int high=low+i-1;
printValues(low, high);
}
}
}
}
************************************************
我更喜欢第一种没有开根号和乘法、除法特殊运算的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐