java編程練習—第一題

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

相關文章
相關標籤/搜索