OneCompiler

Atividade 1 de MD2

#include <stdio.h>
#include <stdlib.h>

void imprimeMenu(){
printf("\n \n********** EXERCICICOS DE PROGRAMACAO - MATEMATICA DISCRETA ********** \n \n");
printf("RECURSAO MATEMATICA:\n");
printf("Digite (1) para calcular o fatorial de um numero. \n");
printf("Digite (2) para encontrar n termos da sequencia de fibonacci. \n");
printf("Digite (3) para encontrar n termos dos numeros naturais. \n");
printf("Digite (4) para calcular o termial de um numero. \n \n");
printf("DIVISIBILIDADE: \n");
printf("Digite (5) para calcular o MDC usando o algoritmo de euclides. \n");
printf("Digite (6) para calcular MMC a partir do MDC. \n \n");
printf("ARITMETICA MODULAR: \n");
printf("Digite (7) para fazer a tabela de Zn para adicao modular. \n");
printf("Digite (8) para fazer a tabela de Zn para multiplicacao modular. \n \n");
printf("Digite (9) para sair. \n \n");
printf("Digite sua escolha: ");
}

void limparTerminal() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}

int fatorialRecursivo(unsigned int n){

if(n == 0)
    return 1;
else
    return n * fatorialRecursivo(n - 1);

}

void fibonacci(unsigned int nTermo, unsigned int termos[], unsigned int indice){

if(indice == 0)
    termos[indice] = 0;
else if(indice == 1)
    termos[indice] = 1;
else
    termos[indice] = termos[indice - 1] + termos[indice - 2];

printf("Termo %u: %u \n", indice, termos[indice]);

if(indice < nTermo)
    fibonacci(nTermo, termos, indice + 1);

}

void nTermosNaturais(unsigned int nTermo, unsigned int termos[], unsigned int indice){

if(indice == 1)
    termos[indice] = 1;
else
    termos[indice] = termos[indice - 1] + 1;

printf("%u, ", termos[indice]);

if(indice < nTermo)
    nTermosNaturais(nTermo, termos, indice + 1);

}

int termialRecursivo(unsigned int n){

 if(n == 0)
    return 0;
else
    return n + termialRecursivo(n - 1);

}

int algoritmoDeEuclidesMDC(int num1, int num2){

int aux;

if(num1 % num2 == 0)
    return num2;
else{
    aux = num2;
    num2 = num1 % num2;
    num1 = aux;
    return algoritmoDeEuclidesMDC(num1, num2);
}

}

int MMCDeDoisNumeros(int num1, int num2){
return (num1*num2/algoritmoDeEuclidesMDC(num1, num2));
}

void tabelaZnAdicaoModular(int n){

int tabela[n + 1][n + 1];

for(int i = 0; i < n + 1; i++){
    for(int ii = 0; ii < n + 1; ii++){
        tabela[i][ii] = 0;
    }
}

for(int i = 0; i < n + 1; i++){
    tabela[i + 1][0] = i;
}

for(int ii = 0; ii < n; ii++){
    tabela[0][ii + 1] = ii;
}

for(int i = 1; i < n + 1; i++){
    for(int ii = 1; ii < n + 1; ii++){
        tabela[i][ii] = (tabela[i][0] + tabela[0][ii]) % n;
    }
}

for(int i = 0; i < n + 1; i++){
    for(int ii = 0; ii < n + 1; ii++){
        printf("   %d   ", tabela[i][ii]);
    }
    printf("\n");
}

}

void tabelaZnMultiplicacaoModular(int n){

int tabela[n + 1][n + 1];

for(int i = 0; i < n + 1; i++){
    for(int ii = 0; ii < n + 1; ii++){
        tabela[i][ii] = 0;
    }
}

for(int i = 0; i < n + 1; i++){
    tabela[i + 1][0] = i;
}

for(int ii = 0; ii < n; ii++){
    tabela[0][ii + 1] = ii;
}

for(int i = 1; i < n + 1; i++){
    for(int ii = 1; ii < n + 1; ii++){
        tabela[i][ii] = (tabela[i][0] * tabela[0][ii]) % n;
    }
}

for(int i = 0; i < n + 1; i++){
    for(int ii = 0; ii < n + 1; ii++){
        printf("   %d   ", tabela[i][ii]);
    }
    printf("\n");
}

}

int main(){

int escolhaMenu;
unsigned int numNatural;

int num1;
int num2;

do{

    imprimeMenu();
    scanf("%d", &escolhaMenu);

    switch(escolhaMenu){

        case 1:
            limparTerminal();
            printf("\n \n ***** FATORIAL DE UM NUMERO ***** \n \n");
            printf("Digite um numero natural para calcular seu fatorial: ");
            scanf("%u", &numNatural);
            printf("\n \n %u! = %d", numNatural, fatorialRecursivo(numNatural));
            break;

        case 2:
            limparTerminal();
            printf("\n \n ***** A SEQUENCIA DE FIBONACCI *****\n \n");
            printf("Quantos termos estarao presentes na sequencia? ");
            scanf("%u", &numNatural);
            
            unsigned int *termos2 = (unsigned int *)malloc((numNatural + 1) * sizeof(unsigned int));
            if (termos2 == NULL) {
                printf("Erro ao alocar memória.\n");
                return 1;
            }

            printf("\nSequencia de Fibonacci:\n");
            fibonacci(numNatural, termos2, 0);

            free(termos2);

            break;

        case 3:
            limparTerminal();
            printf("\n \n ***** N TERMOS DOS NUMEROS NATURAIS ***** \n\n");
            printf("Quantos termos estarao presentes na sequencia? ");
            scanf("%u", &numNatural);
            
            unsigned int *termos3 = (unsigned int *)malloc((numNatural + 1) * sizeof(unsigned int));
            if (termos3 == NULL) {
                printf("Erro ao alocar memória.\n");
                return 1;
            }

            nTermosNaturais(numNatural, termos3, 1);

            free(termos3);

            break;

        case 4:
            limparTerminal();
            printf("\n \n ***** TERMIAL DE UM NUMERO ***** \n \n");
            printf("Digite um numero natural para calcular seu termial: ");
            scanf("%u", &numNatural);
            printf("\n \n %u? = %d", numNatural, termialRecursivo(numNatural));
            break;

        case 5:
            limparTerminal();
            printf("\n \n ***** MDC DE DOIS NUMEROS ***** \n \n");
            printf("Digite o primeiro numero: ");
            scanf("%d", &num1);
            printf("Digite o segundo numero: ");
            scanf("%d", &num2);
            printf("MDC(%d,%d) = %d", num1, num2, algoritmoDeEuclidesMDC(num1, num2));
            break;

        case 6:
            limparTerminal();
            printf("\n \n ***** MMC DE DOIS NUMEROS ***** \n \n");
            printf("Digite o primeiro numero: ");
            scanf("%d", &num1);
            printf("Digite o segundo numero: ");
            scanf("%d", &num2);
            printf("MMC(%d,%d) = %d", num1, num2, MMCDeDoisNumeros(num1, num2));
            break;

        
        case 7:
            limparTerminal();
            printf("\n \n ***** TABELA DA ADICAO MODULAR ***** \n \n");
            printf("Digite um numero: ");
            scanf("%d", &num1);
            tabelaZnAdicaoModular(num1);
            break;

        case 8:
            limparTerminal();
            printf("\n \n ***** TABELA DA MULTIPLICACAO MODULAR ***** \n \n");
            printf("Digite um numero: ");
            scanf("%d", &num1);
            tabelaZnMultiplicacaoModular(num1);
            break;

        default:
            limparTerminal();
            printf("Digite uma opcao valida. \n");
            break;
    }


}while(escolhaMenu != 9);


return 0;

}