Почему диапазон внутреннего цикла влияет на способ решения этой проблемы?

Напишите статический метод printNumbers, который принимает целое число max в качестве аргумента и выводит все совершенные числа, которые меньше или равны max.

Сначала я продолжал получать неправильный ответ, потому что внутренний цикл был установлен на j ‹ max, прежде чем я изменил его на j ‹ i. Однако я не понимаю, почему этот диапазон имеет значение, потому что в любом случае i % j != 0 не будет, даже если диапазон j будет больше?

for (int i = 1; i <= max; i++) {   
    int sum = 0;

    for (int j = 1; j < i; j++) {
        if (i % j == 0) {
            sum += j;
        }
    }
    if (sum == i) {
        System.out.print(sum + " ");
    }
}

Если бы я изменил внутренний цикл j < max, то printNumbers(6) дал бы и 1, и 6, а printNumbers(500) дал бы только 1 и никакое другое число.


person serena    schedule 05.06.2019    source источник
comment
Разница в том, когда j == i, потому что i % j равно 0, когда это происходит   -  person Andreas    schedule 06.06.2019
comment
Вы пробовали отлаживать?   -  person shmosel    schedule 06.06.2019
comment
Если j разрешено подниматься выше i, например. до max, то во время цикла оно будет больше, чем i. А также нажимайте i один раз за итерацию, получая по модулю 0. Однако обратите внимание, что вы делаете i mod j, а не наоборот. 10 по модулю 5 также равно 0, как и для любого делителя. Итак, вы суммируете все делители i за итерацию.   -  person Zabuzard    schedule 06.06.2019
comment
Например, 1 % 1 == 0 произойдет с j < max, но не с j < i.   -  person Elmar Peise    schedule 06.06.2019


Ответы (1)


Если вы установите j < max во внутреннем цикле, то когда j = i, i % j == 0 вернет true и исказит ваш результат. Это хороший пример математической ошибки, которую следует остерегаться при кодировании.

person AAA    schedule 05.06.2019
comment
Понятно, поэтому printNumbers(500) не вернет 6 в качестве опции, ни 28, ни 496, потому что сумма будет увеличена на значение, когда j = i, что вы подразумеваете под искажением результата, верно? - person serena; 06.06.2019
comment
Именно это я и имею в виду. Итак, sum == i ошибочно вернет false для этого i (6, 28, 496). - person AAA; 06.06.2019