【算法学习-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
方案二:详细见参考2。注意,参考2中认为节的集合在[2,sqrt(n)]。
关键点在于,(m1+(m1+k-1))*k=n*2,求得k,再求m1,
参考2:/article/4891581.html
我更喜欢第一种没有开根号和乘法、除法特殊运算的方法。
方案一:区间移动的方案,详细见参考。
例如: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); } } } }************************************************
我更喜欢第一种没有开根号和乘法、除法特殊运算的方法。
相关文章推荐
- 算法习题51:输入一个正数n,输出所有和为n连续正数序列
- 输入一个正数n,输出所有和为n连续正数序列
- 网易面试题 输入一个正数n,输出所有和为n连续正数序列
- 输入一个正数n,输出所有和为n的连续正数序列
- 输入一个正数n,输出所有和为n连续正数序列。
- 输入一个正数 n,输出所有和为 n 连续正数序列。 java实现
- 输入一个正数n,输出所有和为n连续正整数序列
- 输入一个正数n,输出所有和为n连续正数序列。
- 输入一个正数 n,输出所有和为n 连续正数序列。
- 输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
- 输入一个正数n,输出所有和为n 连续正数序列
- 输入一个正数 n,输出所有和为 n 的连续正数序列 [No. 25]
- 输入一个正数n,输出所有和为n连续正数序列。
- 写正确程序需要注意的地方:输入一个正数n,输出所有和为n连续正数序列。
- 输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
- 输入一个正数 n,输出所有和为 n 连续正数序列。
- 【每日面试题】输入一个正数n,输出所有和为n连续正数序列
- 输入一个正数n,输出所有和为n 连续正数序列
- 输入一个正数n,输出所有和为n连续正数序列。
- 输入一个正数n,输出所有和为n 连续正数序列