简体   繁体   中英

Sum of odd numbers until reached limit in Javascript

While I was solving a question saying "add odd numbers from 1 to 20", I coded this:

var i, sum=0;
for (i=2; i<=20; i*2){
  sum=sum+i;
}
document.write(sum);

When I launched it through a browser, it did not work. However, when I fixed i*2 into i+=2 , it worked.

What am I missing? Am I not able to use *(multiplier) in For Loops?

The issue is that you're not updating the value of the i in the for loop .

I want add odd numbers from 1 to 20

Then you need to change the initial value of i to 1 .

 var i, sum = 0; for (i = 1; i <= 20; i += 2){ sum += i; } document.write(sum); 

Also, you can find the sum of odd numbers from 1 to 20 by using a formula.

 n = 20; console.log(n % 2 == 0 ? (n * n)/ 4 : ((n + 1) * (n + 1))/4); 

You can you just have to do it simillary to what you've written about sum.

You used there i += 2 and not i + 2 .

The same way just change i * 2 to i *= 2 .

Here is an working example

 var i, sum = 0; for (i = 2; i <= 20; i *= 2) { console.log(i); sum += i; } document.write(sum); 

But a couple of things here.

First of all you wrote

add odd numbers from 1 to 20

and in all your examples you use sum on even numbers.

Secondly , by multiplying you will not achieve your desired goal (as you can see in a snippet above in a console)

So to actually

add odd numbers from 1 to 20

you should do it like this:

 var i, sum = 0; for (i = 1; i <= 20; i += 2) { console.log(i); sum += i; } document.write(sum); 

EDIT

If you want to add even numbers you still can't use multiplying.

Why? Simply because you said yourself that you want a sum of numbers.

So let's say that we start with 2.
If we multiply it by 2 it has the value 4 which is fine.
But now look what happens in the next iteration. Our variable i which has the value 4 is multiplied by 2 and now its new value is 8. So what about 6?
Next iteration multiply 8 by 2 and its new value is 16.

Do you see where this is going?

And when you use i += 2 instead of i *= 2 ?

So if we start with 2 and than we add 2 its new value is 4.
In next iteration we add 2 to 4 and we have 6.
And so on.

If you want to test it, here is an example with multiplying and adding .

Pay attention to console logs

 var i; console.log("Multiplying"); for (i = 2; i <= 20; i *= 2) { console.log("i value is: " + i); } console.log("Adding"); for (i = 2; i <= 20; i += 2) { console.log("i value is: " + i); } 

If you need to add odd numbers from 1 to 20, then you need i+=2 as the third parameter of the for and need to initialize the variable to 1 to get the correct result:

var sum = 0;
for (var i = 1; i <= 20; i += 2) {
    sum += i;
}

When you have

i += 2

2 is added to i and the result is stored into i . When you tried

var i, sum=0;
for (i=2; i<=20; i*2){
  sum=sum+i;
}

i*2 calculates the value which is twice as big as i , but it will not change the value of i , so this would "work" instead:

var i, sum=0;
for (i=2; i<=20; i*=2){
  sum=sum+i;
}

where

i *= 2

not only calculates the value twice as big as i , but stores the result into i as well. However, even though this will run, the result will not be correct, since you are using the wrong formula.

Also, you can calculate the result without using a for :

1 + 2 + ... + n = n * (n + 1) / 2

Assuming that n is pair: and since we know that we are "missing" half the numbers and all the pair numbers are bigger exactly with 1 than the previous impair numbers, we can subtract half of the sequence

n * (n + 1) / 2 - n / 2 = (n * (n + 1) - n) / 2 = (n * (n + 1 - 1)) / 2 = n * n / 2

and now we have exactly the double value of what we need, so the final formula is:

sum = n * n / 4;

Let's make this a function

function getOddSumUpTo(limit) {
    if (limit % 2) limit ++;
    return limit * limit / 4;
}

and then:

var sum = getOddSumUpTo(20);

Note that we increment limit if it is odd.

You can use whatever expression in loop header, even this is a valid for loop statement for (;;) which simply runs forever (equivalent to while(true) ).

Problem is that you are not updating the i counter in for (i=2; i<=20; i*2) so the i will stays the same throughout the execution of the loop. If you change it to for (i=2; i<=20; i = i*2) or for (i=2; i<=20; i *=2) then it will work.

It is the same as if you did

 let i = 1; i * 2; console.log(i); i = i * 2; console.log(i); 

The first i * 2 doesn't update the i while the second one does.

You can also translate the for loop into while loop to see the error more clearly.

// wrong
let i = 1;
while(i <= 20) {
  i * 2;
  // do something
}

// right
let i = 1;
while(i <= 20) {
  i = i * 2 // or i *= 2
  // do something
}

Just a side note, if you wanted to perform sum on more types of sequences efficiently than you could use a generator based approach and write your sum function and describe each type of a sequence with a generator function.

 function *generateOdd(start, end) { for (let i = start; i <= end; i++) { if (i % 2 === 1) { yield i; } } } function *generateEven(start, end) { for (let i = start; i <= end; i++) { if (i % 2 === 0) { yield i; } } } function sumNums(gen, start, end) { const generator = gen(start, end); let res = 0; let item = generator.next(); while (!item.done) { res += item.value; item = generator.next(); } return res; } console.log(sumNums(generateOdd, 0, 20)); console.log(sumNums(generateEven, 0, 20)); 

What you are looking is this :

 let sum = 0; for(var i = 2; i <= 20; i += 2){ sum += i; } document.write(sum) 

Another take on this :

 // set to n (what you want). Set to n + 1 var N = 21; // The main driver code create an array from 0-(N-1) and removes all even nums let a = Array.apply(null, {length: N}).map(Number.call, _ => +_).filter(_=>_%2) // console.log the array console.log(a) 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM