Метод, который возвращает количество его положительных факторов в 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);