C ++: Почему я должен добавить логическое выражение? - PullRequest
0 голосов
/ 25 сентября 2019

Код:

  int main() {
    int n, largest = 1;
    cout << "enter :" << endl;
    cin >> n;
    int i = n - 1;
    while(i > 0) {
       if (n % i == 0){
            largest = i;
       }
       i--;
    }
    cout << largest << endl;
    system("pause");
    return 0;
  }

Почему возникают эти ошибки?Этот код продолжает делать ошибки, и мой профессор сказал, что я должен добавить логическое выражение.Но я не знаю почему и куда мне его добавлять?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

(Вдохновлено выступлением Александреску на CppCon 2019)

Напомним, что контрольная проверка в цикле не обязательна - мы знаем, что X % 1 равен 0 для любого X. Также, в соответствии с обязательством Александрескудля бесконечных циклов, мы могли бы переписать цикл следующим образом (он будет иметь дополнительный бонус за исправление, но также улучшит его производительность):

if (n <= 1) {
    return;
}
largest = n - 1;
for (;; --largest) {
    if (n % largest == 0)
        break;
}

// Here largest is usable
0 голосов
/ 25 сентября 2019

Перепишите этот цикл

while( i > 0){
    if ( n % i == 0){
        largest = i;
    }
    i --;
}

, например, как

while( i > 0 && n % i != 0 ) i--;

if ( i ) largest = i;

Также вместо типа int следует использовать тип unsigned int.В противном случае пользователь может ввести отрицательное число.В этом случае цикл не имеет смысла.

Используя ваш подход, программа может выглядеть, например, следующим образом

#include <iostream>

int main() 
{
    unsigned int n = 0, largest = 1;

    std::cout << "enter a non-negative number: ";

    std::cin >> n;

    if ( n != 0 )
    {
        unsigned int i = n - 1;

        while ( i > 0 && n % i != 0 ) i--;

        if ( i ) largest = i;
    }

    std::cout << "The largest own divisor is " << largest << std::endl;

    return 0;
}
...