Prévia do material em texto
Universidade Federal do Ceará Trabalho de Matemática Discreta Professor: Wladimir Equipe Samuel Sanches de Freitas Paulo Felipe Dantas Ericson Oliveira Merson Alexandre Souza PROBLEMA 1 Resposta. Para achar o valor basta descobrir o valor que deveria existir se fossem entrados todos os números e depois basta subtrair do valor que foi entrado. package br.ufc.matematicadiscreta.respostas; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class Ex01 { public static void main(String[] args) { Scanner in = new Scanner(System.in); BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); int quantidadeDeNumeros = 0; String numeros = null; int somaTotal = 0; int somaEsperada = 0; // Begin Input quantidadeDeNumeros = in.nextInt(); try { numeros = input.readLine(); } catch (IOException e) { e.printStackTrace(); } // End Input String [] nums = numeros.split(" "); //Calculating the total plus for(int i = 0 ; i < nums.length ; i++ ){ somaTotal = somaTotal + Integer.parseInt(nums[i]); } //Calculating the expected plus for (int i = 1; i < quantidadeDeNumeros + 1; i++) { somaEsperada = somaEsperada + i; } //Output System.out.println((somaEsperada - somaTotal)); } } PROBLEMA 2 Resposta criamos uma variável numero de cortes que serve para ler a quantidade de cortes dados na barra, no c são o estoque sempre recebe a quantidade de pedaços que foram cortados -1e o resto é armazenado no estoque que no caso este - 1 é o pedaço que vai ser cortado novamente, por isso que se recebe numero de pedaços - 1 ate o fim da interação. package br.ufc.matematicadiscreta.respostas; import java.util.Scanner; public class Ex02 { public static void main(String[] args) { int numCortes; int estoque = 0; Scanner input = new Scanner(System.in); numCortes = input.nextInt(); //Leitura das variaveis for (int i = 0; i < numCortes; i++) { // armazenado o que não vai ser cortado em estoque estoque += ((input.nextInt()) -1); } //Saida System.out.println(estoque); } } PROBLEMA 3 Resposta Para resolver este problema basta codificar a função em uma função recursiva ou iterativa. package br.ufc.matematicadiscreta.respostas; import java.util.Scanner; public class Ex03 { public static void main(String[] args) { Scanner input = new Scanner(System.in); int aux = input.nextInt(); while(aux != 0){ System.out.println("f91(" + aux + ") = " + f91(aux)); aux = input.nextInt(); } } static int f91(int n){ if ( n <=100 ) { return f91(f91(n + 11)); } return n - 10; } } PROBLEMA 4 Resposta Para Descobrir se o numero e primo basta somar os números das posições pares e subtrair pelos números das posições impares e se o resultado for um numero divisível por onze então o numero inicial é um numero divisível por onze. package br.ufc.matematicadiscreta.respostas; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; public class Ex04 { public static void main(String[] args) { BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String caminhoDoAquivo; String numero = null ; FileReader reader = null; try { //Pedi o caminho do arquivo System.out.println("Digite o caminho completo do arquivo com os dados: "); caminhoDoAquivo = input.readLine(); //Abre o arquivo reader = new FileReader(caminhoDoAquivo); BufferedReader buffer = new BufferedReader(reader); numero = buffer.readLine(); //Efetua as Divisões while( numero.equals("0") == false ){ divisivel(numero); numero = buffer.readLine(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // Metodo para saber se o numero é primo public static boolean divisivel(String numero){ int somaPosicaoPar = 0; int somaPosicaoImpar = 0; for( int i = 0 ; i < numero.length() ; i++ ){ if( i % 2 == 0 ){ somaPosicaoPar += Character.getNumericValue(numero.charAt(i)); }else { somaPosicaoImpar += Character.getNumericValue(numero.charAt(i)); } } if( (somaPosicaoImpar - somaPosicaoPar) % 11 == 0){ System.out.println(numero + " is a Multiple of 11."); return true; }else { System.out.println(numero + " is not a Multiple of 11."); return false; } } } PROBLEMA 5 Resposta Quando temos um quadrado NxN a quantidade de quadrados diferentes é a soma dos quadrados perfeitos de 1 a n. Ex.: quando temos uma com 3x3 somamos a quantidade de (3x3)+(2x2)+(1x1) onde 3² representa a quantidade de quadrados formados com 1x1 e (2²) representa a quantidade de quadrados formados com 2x2 e 1² representa a quantidade de quadrados formados com 3x3 package br.ufc.matematicadiscreta.respostas; import java.util.Scanner; public class Ex05 { public static void main(String[] args) { int n; Scanner input = new Scanner(System.in); do{ int k=0; n = input.nextInt(); if ( n >= 1 && n <=100){ for (int i = n; i>0 ; i--) k=k+(i*i); } System.out.println(k); }while(n == 0); } } PROBLEMA 8 Resposta Para saber se ele pode ganhar basta saber se o resto da divisão entre todas as pétalas (p) e a quantidade das pétalas que podem ser retiradas mais um (n+1) é igual a zero, se for ele ganha senão ele perde. somamos a quantidade de (3x3)+(2x2)+(1x1) onde (3x3) representa a quantidade de quadrados formados com 1x1 package br.ufc.matematicadiscreta.respostas; import java.util.Scanner; public class Ex08 { public static void main(String[] args) { int petalasTotais, petalasRetiradas; Scanner input = new Scanner(System.in); do { petalasTotais = input.nextInt(); petalasRetiradas = input.nextInt(); if( (petalasTotais + petalasRetiradas) == 0){ break; } if( petalasTotais % (petalasRetiradas + 1)== 0 ) System.out.println("nao"); else System.out.println("sim"); } while(true); } } PROBLEMA 9 Resposta Para encontrar a resposta o numero de bits, basta pegar no valor e dividir pela maior célula e depois pegar o resto e dividir pela cédula seguinte até achar todos os valores. package br.ufc.matematicadiscreta.respostas; import java.util.ArrayList; import java.util.Scanner; public class Ex09 { public static void main(String[] args) { ArrayList<Integer> numeros = new ArrayList<Integer>(); Scanner input = new Scanner(System.in); int num; do { num = input.nextInt(); if(num > 0 && num < 10000) numeros.add(num); }while(num != 0); for (int x = 0 ; x < numeros.size(); x++) { int i, j, k, l; double aux = 0; //Contando notas de 50 aux = numeros.get(x); i = (int) aux / 50; //Contando notas de 10 aux = aux % 50; j = (int) aux / 10; //Contando notas de 5 aux = aux % 10; k = (int) aux / 5; //Contando notas de 1 l = (int) aux % 5; System.out.println("Teste " + x); System.out.println(i + " " + j + " " + k + " " + l); } } } PROBLEMA 10 Resposta Para encontrarmos a maior metragem para as fatias devemos dividir todos os pãe s de forma com que o numero da divisao seja o maior possível, mesmo que ignoreos restos da divisão. Para fazer isto, fiz da seguinte maneira, pega se o valor maiorde metragem dos pães (o maior pão) e divide os outros pães por ele, se não encontrar diminui em uma medida ate encontrarmos a divisão que de a mesma quantidade de pessoas. package br.ufc.matematicadiscreta.respostas; import java.util.Scanner; public class Ex10 { public static void main(String[] args) { int qPessoas, qPao; int [] paes; int pedaco; Scanner input = new Scanner(System.in); qPessoas = input.nextInt(); qPao = input.nextInt(); paes = new int[qPao]; for (int i = 0; i < qPao ; i++){ paes[i] = input.nextInt(); } int maior = 0; for ( int i = 0 ; i < qPao ; i++ ) { if (maior < paes[i]) { maior = paes[i]; } } // para fazer as divisoes dos paes... for( int i = maior+1 ; i >= 1 ; i-- ){ pedaco = 0; //para percorer o vetor com os tamanhos dos paes... for (int j = 0; j < paes.length; j++) { //divisao dos paes... pedaco += paes[j] /i; } //condição de parada... if (pedaco >= qPessoas ) { //imprimir o tamanho do pedaço... System.out.println(i); break; } } } } PROBLEMA 11 Resposta /* * Para Resolver está questão basta efetuar um calculo de * força bruta para e verificar se os numeros achados * estabelecem as condições: * - a² + b² = c²; * - a + b + c = 1000; * Mas para otimizar a busca basta seguir a norma de que: * {a < b < c}; * por isso a = 0 e b = a e c = b; */ package br.ufc.matematicadiscreta.respostas; public class Ex11 { public static void main(String[] args) { for (int a = 0; a < 500; a++) for (int b = a ; b < 500 ; b++) for (int c = b ; c < 500 ; c++) if ( ((a)+(b)+(c)==1000) && (a*a)+(b*b)==(c*c)) System.out.println("a="+a+" b="+b+" c="+c); } }