Вы уже получили несколько хороших ответов, в основном предлагая что-то вроде:
#include <stdio.h>
int main(int argc, char * argv[])
{
int i;
int soln = 0;
for (i = 1; i < 1000; i++)
{
if ((i % 3 == 0) || (i % 5 == 0))
{
soln += i;
}
}
printf("%d\n", soln);
return 0;
}
Так что я собираюсь пойти другим путем. Я знаю, что вы делаете это, чтобы выучить C, так что это может быть немного касательно.
Действительно, вы заставляете компьютер работать слишком усердно для этого :). Если бы мы заранее кое-что выяснили, это могло бы облегчить задачу.
Ну, сколько кратных 3 меньше 1000? По одному на каждый раз, когда 3 входит в 1000 - 1.
mult 3 = & lfloor; (1000 - 1) / 3 этаж; = 333
(& lfloor; и & rfloor; означают, что это этаж деление или, в терминах программирования, целое деление, где остаток отбрасывается).
А сколько кратных 5 меньше 1000?
мульт 5 = & lfloor; (1000 - 1) / 5 этаж; = 199
Теперь, какова сумма всех кратных 3, меньших 1000?
сумма 3 = 3 + 6 + 9 + ... + 996 + 999 = 3 раза; (1 + 2 + 3 + ... + 332 + 333) = 3 раза; & сумма; я = от 1 до нескольких 3 i
А сумма всех кратных 5 меньше 1000?
сумма 5 = 5 + 10 + 15 + ... + 990 + 995 = 5 & times; (1 + 2 + 3 + ... + 198 + 199) = 5 & times; & sum; я = от 1 до нескольких 5 i
Некоторые кратные 3 также кратны 5. Это кратные 15.
Так как они учитываются в mult 3 и mult 5 (и, следовательно, сумма 3 и сумма 5 ), нам нужно знать mult 15 и сумма 15 , чтобы не считать их дважды.
mult 15 = & lfloor; (1000 - 1) / 15 этаж; = 66
сумма 15 = 15 + 30 + 45 + ... + 975 + 990 = 15 & times; (1 + 2 + 3 + ... + 65 + 66) = 15 & times; & sum; я = от 1 до нескольких 15 i
Таким образом, решение проблемы " найти сумму всех кратных 3 или 5 ниже 1000 " будет тогда
солнеч = сумма 3 + сумма 5 - сумма 15
Итак, если бы мы хотели, мы могли бы реализовать это напрямую:
#include <stdio.h>
int main(int argc, char * argv[])
{
int i;
int const mult3 = (1000 - 1) / 3;
int const mult5 = (1000 - 1) / 5;
int const mult15 = (1000 - 1) / 15;
int sum3 = 0;
int sum5 = 0;
int sum15 = 0;
int soln;
for (i = 1; i <= mult3; i++) { sum3 += 3*i; }
for (i = 1; i <= mult5; i++) { sum5 += 5*i; }
for (i = 1; i <= mult15; i++) { sum15 += 15*i; }
soln = sum3 + sum5 - sum15;
printf("%d\n", soln);
return 0;
}
Но мы можем сделать лучше. Для расчета отдельных сумм у нас есть тождество Гаусса , в котором говорится, что сумма от 1 до n (иначе: i = 1 до n i) равна n & times; (n + 1) / 2 Итак:
сумма 3 = 3 раза; мульт 3 раз (мульт 3 + 1) / 2
сумма 5 = 5 & times; мульт 5 & times; (мульт 5 + 1) / 2
сумма 15 = 15 & times; мульт 15 & times; (мульт 15 + 1) / 2
(Обратите внимание, что здесь мы можем использовать нормальное или целочисленное деление - это не имеет значения, поскольку одно из n или n + 1 должно делиться на 2)
Теперь это довольно аккуратно, поскольку это означает, что мы можем найти решение без использования цикла:
#include <stdio.h>
int main(int argc, char *argv[])
{
int const mult3 = (1000 - 1) / 3;
int const mult5 = (1000 - 1) / 5;
int const mult15 = (1000 - 1) / 15;
int const sum3 = (3 * mult3 * (mult3 + 1)) / 2;
int const sum5 = (5 * mult5 * (mult5 + 1)) / 2;
int const sum15 = (15 * mult15 * (mult15 + 1)) / 2;
int const soln = sum3 + sum5 - sum15;
printf("%d\n", soln);
return 0;
}
Конечно, с тех пор, как мы зашли так далеко, мы могли провернуть все это вручную:
сумма 3 = 3 раза; 333 раза; (333 + 1) / 2 = 999 раз; 334/2 = 999 раз; 117 = 117000 - 117 = 116883
сумма 5 = 5 & times; 199 & times;; (199 + 1) / 2 = 995 & times; 200/2 = 995 & times; 100 = 99500
сумма 15 = 15 & times; 66 & times; (66 + 1) / 2 = 990 & times; 67/2 = 495 & times; 67 = 33165
солнеч = 116883 + 99500 - 33165 = 233168
И напишите гораздо более простую программу:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("233168\n");
return 0;
}