Decomposition in cousins

2

Hello everyone, I am learning C ++ for Data Structure and have some error in the code that is creating an infinite loop.

#include <stdio.h>

int fatores(int a[], int n, int *x) {
    int primo = 2;    // primeiro primo
    int qtdzero = 0;  // incrementa sempre que o resto do número der zero.
    int divisoes = n; // só recebe do parâmetro
    int count = 0;    // contador pra pular o endereço do vetor a

    while (divisoes > 1) {   // vai sair do loop quando divisão chegar a 1
     bool sair = true; 
     for (int i = 1 ; i <= primo ; i++) {
         if (primo % i == 0) {     //teste se é primo ou não
             qtdzero++;
         }
     }
     if (qtdzero == 2) {   //se for primo entra aqui.
         while (sair) {
            if ((divisoes % primo == 0) && (divisoes >= primo)) {
                a[count++] = primo;   //armazena o primo
                divisoes = divisoes / primo;
                (*x)++;
            } else {
                sair = false;
                primo++;
            }
         }
     } else { // se falso, passa pro próximo número e faz o mesmo teste
         primo++;
         qtdzero = 0;
     }
    }
    return ((*x > 10) ? 1 : 0); // retorna quantidade de decomposições
}

int main() {
  int *a = new int[20]; //guarda os números primos
  int *x = new int; // guarda a quantidade de vezes que foi decomposto
  int res = fatores(a, 24, x);

  printf("%i\n", res); // printa o retorno da função fatores

  for (int i = 0; i < 20 ; i++) // exibe os valores decompostos
    printf("%i\n", a[i]);
}
    
asked by anonymous 29.08.2015 / 22:45

1 answer

1

The code is really confusing. It is entering an infinite loop because divisoes starts at 24, then becomes valued 12, then 6 and finally 3. When divisoes has 3 it does not enter this condition:

if ((divisoes % primo == 0) && (divisoes >= primo))

This occurs the first time when primo has 2 and the rest of the division is not zero. The code drops to this% innermost%:

else 
{
     sair = false;
     primo++;
}

Here he does not zero the variable else that defines whether the number is prime or not so he will not take the test when qtdzero is worth 3. He will only retake the test when cousin is 5 because when 3 entered the second primo and zerou else .

In order not to change your code very much, do so:

if ((divisoes % primo == 0) && (divisoes >= primo)) 
{
     a[count++] = primo;
     divisoes = divisoes / primo;
     (*x)++;
} 
else 
{
     sair = false;
     primo++;
     qtdzero = 0;
}
    
30.08.2015 / 00:57