Я не уверен, но я предполагаю, что в коде:
if ((perfect % divisor) == 0)
divisor = prevtemp;
Вы намеревались вместо этого prevtemp=divisor
. Это решает очевидную проблему, но все же оставляет совсем немного, не похоже, что он делает то, что вы, вероятно, намеревались. Например, я не могу понять, что limit
предназначено для выполнения - вы инициализируете его и увеличиваете его, но, насколько я вижу, вы никогда не используете его значение (ну, я думаю, вы используете его, но его значение всегда совпадает с divisor
, поэтому я не уверен, почему вы считаете, что вам нужны оба, или как limit
имеет какое-то значение в качестве его имени).
Редактировать: имело бы смысл иметь limit
. В частности, факторы всегда идут парами: один, который меньше или равен квадратному корню из числа, и тот, который соответствует первому, который всегда больше или равен квадратному корню из числа. Таким образом, вам не нужно сканировать полностью до самого числа в поисках факторов - вы можете установить квадратный корень числа в качестве предела и сканировать только до этой точки. Для каждого фактора, который вы найдете до этого момента, коэффициент совпадения будет perfect/divisor
. Так как вы уже получили один рабочий пример, я думаю, что я мог бы просто надеяться, что это не домашняя работа, и опубликовать также пример:
bool is_perfect(int number) {
int limit = sqrt((double)number);
int sum = 1;
for (int i=2; i<=limit; i++)
if (number % i == 0)
sum += i + number/i;
return sum == number;
}