определить, является ли число совершенным или простым

проблема: "Напишите функцию, чтобы узнать, является ли число простым или совершенным числом".

до сих пор я сначала работал над идеальной частью, и вот что у меня есть:

#include <iostream>
using namespace std;
bool perfectNumber(int);
int main()
{
 int number;

 cout<<"Please enter number:\n";
 cin>>number;
 bool perfectNumber(number);

 return 0;
}
bool perfectNumber(int number)
{
 int i;

 int sum=0;
 for(i=1;i<=number/2;i++)
 {
  if(number%i==0)
  {
   sum+=i;
  }
 }
 if (sum==number)
  return i;
 else
  return 0;
}

ОДНАКО, похоже, в этом коде есть ошибки. Я просмотрел книгу, но ничего не говорит об этой теме. Я хотел бы получить совет о том, как исправить этот код.

Благодарность!


person carla    schedule 12.12.2010    source источник
comment
% означает остаток от числа/i, поскольку 4%2=0   -  person m.qayyum    schedule 13.12.2010
comment
Звучит как один из проектов Эйлера. Но может это только у меня ;)   -  person Marcus Borkenhagen    schedule 13.12.2010
comment
Какие ошибки вы получаете. Глядя на пример кода, вы определяете perfectNumber (int) как логическое значение, но возвращаете целое число.   -  person Ash Burlaczenko    schedule 13.12.2010
comment
@Ash Burlaczenko: В этом нет ничего плохого. Проблема в строке 10 (см. ответ Джеймса Макнеллиса).   -  person TonyK    schedule 13.12.2010


Ответы (3)


bool perfectNumber(number);

Это не вызывает функцию perfectNumber; он объявляет локальную переменную с именем perfectNumber типа bool и инициализирует ее значением number, преобразованным в тип bool.

Чтобы вызвать функцию perfectNumber, вам нужно использовать что-то вроде:

bool result = perfectNumber(number);

or:

bool result(perfectNumber(number));

Еще одно замечание: если вы собираетесь читать ввод из потока (например, cin>>number), вы должны убедиться, что извлечение значения из потока прошло успешно. Как и сейчас, если вы введете asdf, извлечение завершится ошибкой, а number останется неинициализированным. Лучший способ проверить успешность извлечения — просто проверить состояние потока:

if (cin >> number) {
    bool result = perfectNumber(number);
}
else {
    // input operation failed; handle the error as appropriate
}

Вы можете узнать больше о том, как устанавливаются и сбрасываются состояния ошибок потока, в Семантика флагов на basic_ios . Вам также следует обратиться к хорошей книге C++ начального уровня, чтобы узнать больше лучшие практики потокового использования.

person James McNellis    schedule 12.12.2010

person    schedule
comment
логическое простое число = истина; // Вычисляет квадратный корень из 'x' Правда? также важно правильно размещать комментарии. - person Eric Fortis; 13.12.2010
comment
Это так неправильно. Если вы проверяете, является ли x простым, избавьтесь от внешнего цикла. Если вы проверяете все простые числа в [1,x], тогда граница внутреннего цикла должна быть sqrt(i), а не sqrt(x). И в этом случае это смехотворно неэффективный способ проверки простых чисел в этом диапазоне. См. en.wikipedia.org/wiki/Sieve_of_Eratosthenes, чтобы узнать о гораздо лучшем методе. - person Chris Hopman; 13.12.2010

person    schedule
comment
is_ptr возвращает false или true для идеального числа, а is_prim возвращает true или false для простого числа. - person opc0de; 13.12.2010
comment
Пожалуйста, отформатируйте код. Разве вы не посмотрели на предварительный просмотр и не заметили, что это нечитаемо, прежде чем публиковать ответ? В редакторе выберите исходный код, затем нажмите кнопку 101010. - person jalf; 13.12.2010
comment
@jalf 101010 означает fine ? Я не знал :-) - person Luc M; 10.01.2012
comment
смешной. ;) кстати, чтобы избежать путаницы, если другие прочитают это, кнопка { } использовалась для отображения чего-то вроде 10010 вместо этого. - person jalf; 10.01.2012