Nkosie Maphumulo
Nkosie Maphumulo

Reputation: 185

Modify solution to use a single loop

I managed to solve this, below is my solution :

public class ProblemA001k {

public static void main(String[] args) {



        System.out.println("Sum from 1" + " to " + divQ + ":" + sum2);
        System.out.println();
        divQ += q;
        newQ += q;
        sum1 = 0;
        sum2 = 0;
        }

key.close();
}

}

Now I was told to modify my solution so that it uses ONLY ONE LOOP. I have 3 loops in the code above, even when I tried using only 2 loops I struggled. but ONE LOOP ? I don't know how to improve my code. Please help me.

Upvotes: 12

Views: 3175

Answers (4)

user6904265
user6904265

Reputation: 1938

I found a nice solution with java8 Streams:

int n=1000;
int q=50;
int length = n/q -1;        
int[] previousSum={0};
IntStream.range(0, length).map(i -> (i+1)*q).forEach(s -> {
    int sum=(s*(s+1))/2;
    int batch = sum - previousSum[0];
    previousSum[0] = sum;
    System.out.println("Sum from " + (s - q + 1) + " to " + s + ":" + batch); 
    System.out.println("Sum from 1 to " + s + ":" + sum);
});

Upvotes: 2

AxelH
AxelH

Reputation: 14572

This is a Mathematic problem.

If you know that you can find the sum of all integers from 1 to X, you just need to do X * (X+1) / 2.

You can find all the batch values easily.

Sum from 1 to 400: 80200
Sum from 401 to 450: 21275
Sum from 1 to 450: 101475

Will be found like this :

450 * 451 / 2 = 101475 (1 to 450)
400 * 401 / 2 = 80200  (1 to 400)
101475 - 80200 = 21275 (401 to 450)

With this, you can limit the loop to just calculate the values from q to n by incrementing by q

And a quick code to do it :

static void sum(int n, int q){
    int i = q;
    int sum, tmp=0;
    while(i < n){
        sum = i * (i+1) / 2;
        System.out.println(String.format("Sum from %d to %d : %d", i-q+1 , i, sum - tmp));
        System.out.println(String.format("Sum from %d to %d : %d", 1, i, sum));
        tmp = sum;
        i += q;
    }
}

And I run it with

public static void main(String[] args){
    sum(500, 50);
}

to have this result

Sum from 1 to 50 : 1275
Sum from 1 to 50 : 1275
Sum from 51 to 100 : 3775
Sum from 1 to 100 : 5050
Sum from 101 to 150 : 6275
Sum from 1 to 150 : 11325
Sum from 151 to 200 : 8775
Sum from 1 to 200 : 20100
Sum from 201 to 250 : 11275
Sum from 1 to 250 : 31375
Sum from 251 to 300 : 13775
Sum from 1 to 300 : 45150
Sum from 301 to 350 : 16275
Sum from 1 to 350 : 61425
Sum from 351 to 400 : 18775
Sum from 1 to 400 : 80200
Sum from 401 to 450 : 21275
Sum from 1 to 450 : 101475

The good think with this solution is the number of loop, this will increment by q instead of 1

Note : The solution is a quick implementation, this could be done better.

EDIT :

Thanks to Margaret Bloom in the comments to point out the name of this formula :) For more information, you are welcome to look at Triangular Number

Upvotes: 11

Bijay Gurung
Bijay Gurung

Reputation: 1104

This should do it:

int totalSum = 0;
int batchSum = 0;

for (int i = 1; i <= n; i++) {
    totalSum += i;
    batchSum += i;
    if (i % q == 0) {
        System.out.println("Sum from " + (i - q + 1) + " to " + i + ":" + batchSum);
        System.out.println("Sum from 1 to " + i + ":" + totalSum);
        batchSum = 0;
    }

}

Edit: The better Math way:

int lastTotalSum = 0;
for (int i = 1; i <= n / q; i++ ) {
    int top = i * q;
    int totalSum = top * (top + 1) / 2;
    int batchSum = totalSum - lastTotalSum;
    System.out.println("Sum from " + (top - q + 1) + " to " + top + ":" + batchSum);
    System.out.println("Sum from 1 to " + top + ":" + totalSum);
    lastTotalSum = totalSum;

}

Upvotes: 6

Mats391
Mats391

Reputation: 1209

Do one loop iterating entire range and use indexes to decide whether to add, reset or print your sums.

Hope this gives your right idea, if you still dont know I can illustrate it a bit more.

Upvotes: 0

Related Questions