Méthode qui retourne le compte de ses facteurs positifs en C

J’essaie de faire une méthode dont la fonction nommée est factor_count qui accepte un entier en tant que paramètre et renvoie le nombre de facteurs positifs.

Par exemple, les six facteurs de 32 sont 1, 2, 4, 8, 16 et 32; l’appel de ma méthode doit donc renvoyer 6.

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

% est l’opérateur modulo. C’est le rest après une division. Si le rest après division est égal à zéro, vous devez incrémenter le nombre. Le rest de la division par 1 est toujours zéro.

 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; } 

Supprimez le number%1==0 et remplacez-le par le number%i==0 , puis count = count + 1 . Initialize count = 0 dehors de la boucle.

La solution habituelle consiste à essayer les diviseurs: 1,2,3, …, sqrt (n).

Chaque itération, notez le diviseur , le quotient et le rest .

Si le rappel est 0, le diviseur est un facteur. Si le quotient est plus grand que le diviseur, alors le quotient est aussi un nouveau facteur.

Continuez à boucler tant que le diviseur est inférieur au quotient.

Itérer jusqu’au sqrt(n) est suffisant et plus rapide qu’itérer jusqu’à 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; } 

L’amélioration peut inclure la réduction du nombre, chaque fois qu’un diviseur est trouvé. Ce qui suit n’a pas été complètement testé.

 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() passe à un nombre premier factor_count2() .

  // divisor++; divisor = next_prime(divisor);