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循环

相关文章
相关标签/搜索