Метод, который возвращает количество его положительных факторов в C

Я пытаюсь сделать метод, его функция названа factor_count, который принимает целое число в качестве параметра и возвращает количество его положительных факторов.

Например, шесть факторов из 32 - это 1, 2, 4, 8, 16 и 32, поэтому вызов моего метода должен возвращать 6.

int factor_count(int number) {
  int i, count;
  for (i=1;i<=number;i++){
    if(number%1==0){
      count = number%i;
    }
  }
  return count;
}

3 ответа

% является оператором по модулю. Это остаток после деления. Если остаток после деления равен нулю, вы должны увеличить счетчик. Остаток от деления на 1 всегда равен нулю.

int factor_count(int number)
{
    int i, count = 0;

    for (i=1; i<=number; i++)
        /* increment count when the remainder is zero */
        if (number%i==0)
            count++;
    return count;
}

Пожалуйста, удалите number%1==0 и заменить его на number%i==0 а потом count = count + 1, инициализировать count = 0 вне петли.

Обычное решение - попробовать делители: 1,2,3,...,sqrt(n).

На каждой итерации обратите внимание на делитель, частное и остаток.

Если напоминание равно 0, то делитель является фактором. Если частное это больше, чем делитель, то это тоже новый фактор.

Продолжайте цикл, пока делитель меньше, чем частное.

Итерация до sqrt(n) достаточно и быстрее, чем итерация до n

int factor_count(int number) {
  if (number <= 0) {
    return TBD_Code(n);  // OP needs to define functionality for these cases.
  }
  int count = 0;
  int quotient;   
  int divisor = 0;
  do {
    divisor++;
    quotient = number/divisor;
    int remainder = number%divisor;
    if (remainder == 0) {
      count++;
      if (quotient > divisor) count++;
    }
  } while (divisor < quotient);
  return count;
}

Улучшение может включать уменьшение числа каждый раз, когда найден делитель. Следующее не полностью проверено.

int factor_count2(int number) {
  if (number <= 0) {
    return TBD_Code(n);  // OP needs to define functionality for these cases.
  }
  int count = 0;
  int quotient;   
  int divisor = 0;
  do {
    divisor++;
    int remainder;
    do {
      quotient = number/divisor;
      remainder = number%divisor;
      if (remainder == 0) {
        number = quotient;
        count++;
        if (quotient > divisor) count++;
        else break;
      }
    } while (remainder == 0);
  } while (divisor < quotient);
  return count;
}

Еще больше улучшений можно получить с factor_count2() собирается на следующий премьер.

    // divisor++;
    divisor = next_prime(divisor);
Другие вопросы по тегам