I\'m having problems with this code. I don\'t want to look at others, so I\'m wondering what\'s wrong with mine.
If we list all the natural numbers below 10 that are mu
just write this simple java code.
public static void main(String[] args)
{
int i,sum=0;
for ( i = 3; i <1000; i++)
{
if ((i % 3 == 0)||(i%5==0) )
sum=sum+i;
}
System.out.print(sum);
}
You will get the output as 233168
Some certain conditions occurs where both conditions satisfies for 3 as well as 5 also. like when i=15 satisfies for both 15%3==0 and 15%5==0. so probably your answer is more than expected because you tried for both 3 and 5 separately. by doing this during these certain conditions you add repeated values. Hence it is better to check in single loop. like this -
for(int i=0 ; i<1000 ; i++)
{
if(i%3==0 || i%5==0)
{
temp = temp + i;
}
System.out.println(temp);
}
public static int sumOfMultiples(int i, int j, int limit){
int s = --limit / i, t = limit / j, u = limit / (i * j);
return (i*(s*(s+1)/2)) + (j*(t*(t+1)/2)) - ((i*j)*(u*(u+1)/2));
}
Test
actual = Prob1.sumOfMultiples(3, 5, 1000);
assertEquals(233168, actual);
You added all multiples of 15 twice. Using your algorithm, run a third loop and test if the number is divisible by 15, then remove it from the total sum.
A small improvement for the other answers (i
can start from 3
):
public static void main(String[] args) {
int sum = 0;
for (int i = 3; i < 1000; i++) {
if (i % 3 == 0 || i % 5 == 0) {
sum += i;
}
}
System.out.println(sum);
}
For a bigger input number ( Integer.MAX_VALUE
instead of 1000
) it takes:
This is more efficient and uses your initial approach (remove numbers that were taken twice):
public static void main(String[] args) {
long sum = 0 ;
for ( long i = 3 ; i < 1000 ; i+=3 ){
sum+=i;
}
for ( long i = 5 ; i < 1000 ; i+=5 ){
sum+=i;
}
for ( long i = 15 ; i < 1000 ; i+=15 ){
sum-=i;
}
System.out.println(sum);
}
In the first case we have about n
(1000) values for i
, in the second case we have only about n/3 + n/5 + n/15
(600) values for i
. The second one is also better because there are fewer comparisons ( no if
involved ).
For a bigger input number ( Integer.MAX_VALUE
instead of 1000
) it takes:
This solution is based on the following observation:
1 + 2 + ... + n = n*(n+1)/2
public static void main(String[] args) {
int nr = 1000;
nr--;
int x3 = nr/3;
int x5 = nr/5;
int x15 = nr/15;
long sum1 = 3*x3*(x3+1);
long sum2 = 5*x5*(x5+1);
long sum3 = 15*x15*(x15+1);
long sum = (sum1+sum2-sum3)/2;
System.out.println(sum);
}
In this case, even if the input is Integer.MAX_VALUE
, the computation is very fast ( less than 1 ms ).
If a number is a multiplier of both 3 and 5 (e.g.: 15, 30, 45, etc.), you will count it twice. So instead of two for
loops, you should have one, with a complex condition:
public class Multiples {
public static void main (String [] args) {
int temp = 0;
for (int i = 0; i < 1000; i++) {
if (i % 3 == 0 || i % 5 == 0) {
temp = temp + i;
}
}
System.out.println (temp);
}
}