Desafios de Programação

Semana 08

  • Conteúdo
    • Aritmética e Álgebra
    • Atividades
Material Didático cedido pelo Professor Marcos Lage
Introdução
Matemática e competições de programação?
Introdução
Bibliotecas nativas

C/C++ (cstdlib):

          
// inclusão da biblioteca
#include <cstdlib>
using namespace std;

// números aleatórios
int s = srand();
int a = rand(s); // valores inteiros entre o e RAND_MAX

// valores absolutos
int  a = abs(65537);
long la = labs(65537L);
long lla = llabs(65537LL);

// divisão
div_t res = div(31558149,3600); // existem análogos: ldiv e lldiv
printf ("Quociente: %d, resto: %d.\n", res.quot, res.rem);

// string para números C++11
long s = stol("65537");            
       
        
Obs: Estude a documentação oficial para descobrir outras funcionalidades!
Introdução
Bibliotecas nativas

C/C++ (cmath):

          
// inclusão da biblioteca
#include <cmath>
using namespace std;

// acesso a constantes da biblioteca
#define _USE_MATH_DEFINES

// trigonometria (argumento em radianos)
float s = sin(90.0f * M_PI / 180.0f);

// exponenciais
float a = exp(10);   // e^10
float a = pow(3,10); // 3^10

// logs
float a = log(10);   // base e
float a = log2(10);  // base 2
          
        
Obs: Estude a documentação oficial para descobrir outras funcionalidades!
Introdução
Bibliotecas nativas

Java (Random e Math):

          
// números aleatórios
import java.util.Random;

Random rand = new Random();
int n = rand.nextInt(50) + 1; // valor no intervalo [1,50]

// matemática
import java.lang.Math;

// trigonometria (argumento em radianos)
float s = Math.sin(90.0 * Math.Pi / 180.0);

// exponenciais
float a = Math.exp(10);   // e^10
float a = Math.pow(3,10); // 3^10

// logs
float a = Math.log(10);   // base e
float a = Math.log2(10);  // base 2
                    
// conversão de / para strings
int a = String.valueOf("735");
string s = Integer.toString(735);
          
        
Obs: Estude a documentação oficial para descobrir outras funcionalidades!
Introdução
Bibliotecas nativas

Python (random e math):

          
// importação do pacote
import random

n = random.randomInt(1, 50) // valor inteiro no intervalo [1,50]
n = random.random() // valor real no intervalo [0.0,1.0)

// importação do pacote
import math

// trigonometria (argumento em radianos)
s = math.sin(90.0 * math.pi / 180.0);

// exponenciais
a = math.exp(10);   // e^10
a = math.pow(3,10); // 3.0^10.0 
a = 3**10;          // 3^10

// logs
a = math.log(10);   // base e
a = math.log2(10);  // base 2
          
// conversão de / para strings
a = int("735");
s = str(735);          
          
        
Obs: Estude a documentação oficial para descobrir outras funcionalidades!
Números Inteiros Grandes
Introdução
Números Inteiros Grandes
O que cada linguagem oferece?

Java (BigInteger):

          
// números decimais com precisão arbitrária
import java.util.BigInteger;

BigInteger a = BigInteger.valueOf(1250);
BigInteger b = BigInteger.valueOf(5250);

// soma 
BigInteger res = a.add(b);

// multiplicação 
BigInteger res = a.multiply(b);
                   
// quociente (res[0]) e resto (res[1])
BigInteger[] res = a.divideAndRemainder(b)
         
// máximo divisor comum
BigInteger gdc = a.gcd(b)                  
          
        
Obs: Estude a documentação oficial para descobrir outras funcionalidades!

Números Inteiros Grandes
O que cada linguagem oferece?

Python:

                   
# números inteiros com precisão arbitrária 
# Python oferece suporte nativo
a = 1
b = 3
        
# soma 
res = a + b        

# multiplicação 
res = a * b;
                   
# máximo divisor comum
gdc = math.gcd(a,b)                  
          
        
Obs: Estude a documentação oficial para descobrir outras funcionalidades!
Números Inteiros Grandes
O que cada linguagem oferece?
Números Decimais e Racionais Exatos
Introdução
Números Decimais e Racionais Exatos
Identidades Úteis

Assuma que $c = x_1/y_1$ e $d = x_2/y_2$

Soma:
$c + d = \frac{(x_1.y_2 + x_2.y_1)}{y_2.y_1}$

Produto:
$c.d = \frac{x_1.x_2}{y_2.y_1}$

Produto:
$c/d = \frac{x_1.y_2}{x_2.y_1}$

Obs:
Evite denominadores e o numeradores que sejam números inteiros grandes dividindo-os pelo mdc.

Números Decimais e Racionais Exatos
Conversão

Números decimais podem ser convertidos em racionais exatos:

$3.1415 = \frac{3}{1} + \frac{1415}{10000} = \frac{6283}{2000}$

Obs: No caso de dízimas, você deve definir a quantidade de casas decimais que serão consideradas.

$3.14159265359... \approx 3.1415$

$3.1415 = \frac{3}{1} + \frac{1415}{10000} = \frac{6283}{2000}$

Números Decimais e Racionais Exatos
Java

Java (BigInteger):

          
// números decimais com precisão arbitrária
import java.util.BigDecimal;

BigDecimal a = BigDecimal.valueOf(125.012316526);
BigDecimal b = BigDecimal.valueOf(52.5098967);

// número de dígitos decimais
a.setScale(35, BigDecimal.ROUND_HALF_UP);

// soma 
BigDecimal res = a.add(b);

// subtração 
BigDecimal res = a.add(b);

// multiplicação 
BigDecimal res = a.multiply(b);
                   
// divisão
BigDecimal res = a.divide(b)
          
        
Obs: Estude a documentação oficial para descobrir outras funcionalidades!

Números Decimais e Racionais Exatos
Python

Python (decimal):

          
// números decimais com precisão arbitrária
from decimal import *

getcontext().prec = 25  // definição da precisão

a = Decimal('1.2');
b = Decimal('7.3');

// soma 
res = add(a, b);

// multiplicação 
res = multiply(a, b);
                   
// divisão
res = divide(a, b);          
          
        
Obs: Estude a documentação oficial para descobrir outras funcionalidades!

Números Decimais e Racionais Exatos
C/C++

Arredondamento e Truncamento
Introdução
Arredondamento e Truncamento
O que cada linguagem oferece?

C/C++:

          
// arredondamento e truncamento
int a = floor(10.7);  // 10
int a = ceil(10.7);   // 11

int a = round(10.3);  // 10 --> análogo a floor(10.3)
int a = round(10.7);  // 11 --> análogo a ceil(10.7)
int a = round(80.234 * 100) / 100;  // 83.23
          
        

Java:

          
// arredondamento e truncamento
int a = Math.floor(10.7)   // 10
int a = Math.ceil(10.7)    // 11

int a = Math.round(10.3);  // 10 --> análogo a floor(10.3)
int a = Math.round(10.7);  // 11 --> análogo a ceil(10.7)
int a = Math.round(80.234 * 100) / 100;  // 83.23
        
      
Arredondamento e Truncamento
O que cada linguagem oferece?

Python:

          
# arredondamento e truncamento
a = math.floor(10.7)   # 10
a = math.ceil(10.7)    # 11

# arredondamento e truncamento
a = round(10.3);     # 10 --> análogo a math.floor(10.3)
a = round(10.7);     # 11 --> análogo a math.ceil(10.7)
a = round(80.234, 2) # 80.23
          
        
Logaritmos
Identidades úteis

Muitos problemas de competição utilizam identidades de logaritmos na elaboração da solução.

Algumas identidades importantes:

Atividades
Sugestão de estudo

Leitura:

Exercícios:

Desafios de Programação

Semana 08

  • Conteúdo
    • Aritmética e Álgebra
    • Atividades
Material Didático cedido pelo Professor Marcos Lage