输入一个正数n,输出全部和为n连续正数序列。例如输入15,因为1+2+3+4+5=4+5+6=7+8=15,因此输出3个连续序列1-五、4-6和7-8。java
最简单,也是最笨的方法,就是两次循环,代码以下:code
public void getSeri(int n) { if(n == 1) { return; } int length = (n+1)/2; int sum = 0; for(int i = 1; i < length; i++) { sum = i; for(int j = i +1; j <= length; j++) { sum += j; if(sum == n) { System.out.println(i + "-" + j); break; } else if(sum > n) { break; } } } }
咱们先看,这段代码,首先若是输入的是 1直接返回,由于不会有连续的值相加等于本身。而后看length,这个值是咱们for循环的最大值,由于,length的值是输入值的中间值,一单超过了中间值,任意两个值相加都会比n大。好比说,15的中间值是8,8+9=17>15,以后的全部序列都大于15了,因此循环到8就能够终止了,节省下效率。队列
虽然咱们在循环上稍微注意了下效率,但实际上,这个代码的效率仍是很低了,由于作了两次嵌套循环。若是n=100的话,就要作50*50=2500次循环,n越大,速度越慢。rem
因此我又想了,第二种方法,代码以下:get
public void getSeriProv(int n) { if(n == 1) { return; } int length = (n+1)/2; List queue = new LinkedList<>(); int sum = 0; for(int i =1; i <= length; i++) { queue.add(i); sum += i; while(sum > n) { int oldvalue = queue.remove(0); sum -= oldvalue; } if(sum == n) { System.out.println(queue.get(0) + "-" + queue.get(queue.size()-1)); int oldvalue = queue.remove(0); sum -= oldvalue; } } }
我先建立了一个队列。每次循环都向队列的列尾加入当前的数值,同时计算sum和,若是sum比n大的话就移除列头的值,直到sum<=n,若是sum=n则,直接打印结果,移除列头,进行下一次的循环。for循环