Вызов булевой функции в переполнении стека

Вот моя программа, цель которой показать, является ли входное целое число идеальным числом или нет. Требуется использовать логическую функцию и вызывать ее обратно в основной функции. Однако после запуска пробного периода выходных данных нет. Может кто-нибудь помочь этому программированию новичку … Заранее спасибо за любую помощь.

#include <iostream>
using namespace std;

bool perfect ( int num )
{
int sum = 0, i = 1;
while( i < num ) {
if ( num % i == 0 ) {
sum = sum + i;
i++;
}
}

if ( num == sum )
return 1 ;
else
return 0 ;
}

int main()
{
int num ;
cin >> num ;

if ( perfect ( num ) == 1 )
cout << " YES " << endl ;
else
cout << " NO " << endl ;
}

-4

Решение

Давайте посмотрим на ваш цикл, когда num == 3 а также i == 2,

int i = 1;
while( i < num ) {
if ( num % i == 0 ) {
sum = sum + i;
i++;
}
}
  1. i < num является 2 < 3 что верно, поэтому мы войдем в цикл while.
  2. num % i == 0 является 3 % 2 == 0 что неверно, поэтому мы не будем входить в условное.
  3. Мы возвращаемся к вершине цикла while.
  4. i а также num не изменились, так что это бесконечный цикл.

Вы, вероятно, хотите что-то вроде:

bool perfect_number(int x) {
int sum_of_divisors = 0;
for (int divisor = 1; divisor < x; divisor++)
if (x % divisor == 0)
sum_of_divisors += divisor;
return sum_of_divisors == x;
}

Что мы можем оптимизировать в:

bool perfect_number(int x) {
return x == 6 || x == 28 || x == 496 || x == 8128 || x == 33550336;
}
2

Другие решения

Ваша функция perfect(int) возвращать бул, а не целое число, так if(perfect(num)) можно использовать напрямую.
Вы могли бы использовать тип возврата int для функции perfect() использовать условие «если» как: if(perfect(num)==1)

-1

По вопросам рекламы [email protected]