Buscar

Trabalho de Matemtica Discreta


Continue navegando


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