Я пытаюсь решить проблему с этой страницей , и получилось следующее:
public static int metodo() {
int total = 0;
for (int i=1; i<1000; ++i) {
if (i%3 == 0 || i%5 == 0) { total += i; }
};
return total;
}
но я пытаюсь не использовать оператор остатка и каким-то образом получить кратные путем умножения на 5 или 3, но каждый раз, когда я не пытаюсь, это не дает мне ожидаемого результата, есть ли способ сделать это через умножение?
Возможность:
Объяснение: Сначала мы складываем все числа, кратные 3, а затем числа 5. Затем мы вычитаем те, которые кратны обоим (то есть кратны 15), чтобы скорректировать тот факт, что мы добавили их дважды ранее.
В каком-то смысле это скорее математическая задача, чем проблема программирования.
Сначала мы собираемся вычислить сумму чисел, меньших X, кратных делителю D. Мы вычисляем максимальное число, кратное D, которое меньше X, мы называем его M(X,D): M(X,D ) = ( ( X-1) целое_деление D ) * D
В случае делителя 3: M(1000,3) = 999
Вычисляем сумму: 3+6+...+996+999; которую мы называем S(X,D)
Это арифметическая прогрессия , сумма которой равна:
Где :
Что в java мы вычисляем так:
Конечным результатом является сумма кратных 3 и 5, которые меньше X, то есть: S(1000,3)+S(1000,5)
Но есть проблема, проделав вышеописанное, мы добавили числа, кратные 15, дважды, чтобы компенсировать это, мы вычтем их один раз: Окончательный результат = S(1000,3)+S(1000,5)-S(1000,15)
В джаве это:
Эта форма требует постоянного времени выполнения, тогда как с циклом время увеличивается с увеличением X.
Если делать сравнения по отдельности, то это проще, я тоже решал эти задачи, и этот код дал мне правильный результат.