輸入一個正數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循環