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