Получается не верный ответ, что я сделал не так?
#include<iostream>
using namespace std;
/*
* Найти сумму всех кратных 3 или 5 ниже 1000.
*/
void main()
{
int a = 0;
int b = 0;
for (int i = 1; i < 1000; i++)
{
if (i%3==0)
{
a = a + i;
}
if (i % 5 == 0)
{
b = b + i;
}
}
cout << a + b << endl;
}
Ответы (3 шт):
Автор решения: Igor
→ Ссылка
var sum = 0;
for (var i = 1; i < 1000; i++) {
if (i % 3 == 0 || i % 5 == 0)
sum += i;
}
console.log(sum);
var sum = 0;
for (var i = 3; i < 1000; i += 3) {
sum += i;
}
for (var i = 5; i < 1000; i += 5) {
sum += i;
}
for (var i = 15; i < 1000; i += 15) {
sum -= i;
}
console.log(sum);
Автор решения: AR Hovsepyan
→ Ссылка
Если число i не делится на 5, то i * 3 не будет делиться на 5. Исходя из этого, можно написать следующее:
int sum = 0;
for (int i = 1; i <= 333; ++i) {
if (i % 5)
sum += i * 3;
if(i < 200)
sum += i * 5;
}
std::cout << sum;
Таким образом сокращается цикл в три раза:
Автор решения: user7860670
→ Ссылка
Циклы не нужны, так как тут считается сумма арифметической прогрессии. Чтобы не учитывать числа, кратные обоим данным числам, по два раза, из итоговой суммы следует вычесть сумму чисел, кратных их произведению.
#include <iostream>
static auto asum(auto const step, auto const limit)
{
auto const n{(limit - 1) / step};
return (step * n * (n + 1)) / 2;
}
int main()
{
auto const limit{1000};
auto const a{3};
auto const b{5};
auto const sum{asum(a, limit) + asum(b, limit) - asum(a * b, limit)};
::std::cout << sum << ::std::endl;
return 0;
}