Calculation of the smallest divisible number giving infinite loop in C

Asked

Viewed 332 times

0

I did a C program to solve the following exercise:

Exercício

Code:

#include "stdio.h"
#include "stdlib.h"

int main(int argc, char const *argv[]) {

int num = 0;
int count = 20;
int contaDivisores = 0;

for(int i = 1; i <= count; i++){
    for(int j = 1; j <= 20; j++){
        //Esse loop checa se o numero atual e divisivel por todos os numeros de 1 a 20
        if(i % j == 0){
            contaDivisores++;//Se for divisivel, aumenta o contador de divisores
            printf("%d\n", i);
        }
    }
    if(contaDivisores == 20){
        num = count;/*Se o numero acima for divisivel por todos
         os numeros, significa que a contagem atual é o numero desejado*/
        break;
    }else{
        count++;//Se não for, muda o numero que deverá ser checado em 
  //seguida
    }
 }

 printf("Numero:%d\n", num);//Mostra o número

 return 0;
}

However, when executing the code, you get an infinite loop:

Loop Infinito

I tried to make some changes to the code, but I could not solve the problem. What should be done so that the infinite loop does not occur?

2 answers

1

Dude I didn’t quite understand the question, but the loop happens because its contable variable will always be bigger than i, so I advise you to use "while" and without a variable, put the number 20 as you did in the second "for".

1


A very practical solution (explanations in the comments in the code):

// Define o range de divisores:
const unsigned short MAX = 20;

int main(int argc, char const *argv[]) {

    // Resultado, do tipo long, pois rapidamente estoraria
    // valor máximo de int (2147483647). 
    // O máximo de ulong é 18446744073709551615
    unsigned long int number = 0;

    // Loop infinito, pois não sabemos quantas iterações haverão
    while (1)
    {
        // Número de divisores encontrados
        unsigned short dividers = 0;

        number++;

        // Itera sobre o range de valores
        for (unsigned short i = 1; i <= MAX; i++)
        {
            // O valor é um divisor?
            if (number % i == 0) {
                // Se sim, incrementa o número de divisores
                dividers++;
            } else {
                // Se não, vai para o próximo número
                break;
            }
        }

        // Foram encontrados todos os divisores?
        if (dividers == MAX) {
            // Sim, exibe o valor e encerra o loop infinito
            printf("Numero:%d\n", number);
            break;
        }
    }

    return 0;
}

Turning to 10 values, the result is 2520, as expected. For 20 values, the result is 232792560.

See working here or here.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.