primeiro semestre de 2016 - instituto de computaçãordahab/mc102/welcome_files/... ·...
TRANSCRIPT
![Page 1: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/1.jpg)
MC102 – Algoritmos e Programacao de Computadores
Instituto de Computacao
UNICAMP
Primeiro Semestre de 2016
![Page 2: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/2.jpg)
Roteiro1 Maior numero
2 Soma de n numeros
3 Fatorial
4 Maximo Divisor Comum (MDC)
5 Numeros primos
6 Primeiros n numeros primos
7 Fatoracao em numeros primos
8 Numeros de Fibonacci
9 Numeros Pitagoricos
10 Conversao de numeros binarios para decimais
11 Conversao de numeros decimais para binarios
12 Numero de letras de uma sequencia de caracteres
13 Jogo de dados
14 Exercıcios
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 2 / 65
![Page 3: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/3.jpg)
Introducao
Vimos quais sao os comandos de repeticao em C:I whileI do-whileI for
Veremos agora alguns exemplos de utilizacao desses comandos.
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 3 / 65
![Page 4: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/4.jpg)
Maior numero
Vamos escrever um programa que receba n numeros inteiros (n ≥ 1)e descubra qual deles e o maior.
O programa deve ter os seguintes passos:1 Ler um numero inteiro n.2 Ler n numeros inteiros.3 Determinar o maior entre os n numeros inteiros.
Como determinar o maior?
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 5 / 65
![Page 5: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/5.jpg)
Maior numero
A ideia e criarmos uma variavel maior que armazenara o maiornumero lido ate entao.
Algoritmo:
maior(n)
ler um numero maior
repetir n-1 vezes
ler um numero aux
se aux > maior ent~ao
maior = aux
imprimir maior
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 6 / 65
![Page 6: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/6.jpg)
Maior numero
#include <stdio.h>
int main() {
int n, maior, i, aux;
printf("Digite a quantidade de numeros: ");
scanf("%d", &n);
printf("Digite um numero: ");
scanf("%d", &maior);
for (i = 1; i <= n-1; i++) {
printf("Digite um numero: ");
scanf("%d", &aux);
if (aux > maior)
maior = aux;
}
printf("Maior numero: %d\n", maior);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 7 / 65
![Page 7: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/7.jpg)
Maior numero
#include <stdio.h>
int main() {
int n, maior, i, aux;
printf("Digite a quantidade de numeros: ");
scanf("%d", &n);
printf("Digite um numero: ");
scanf("%d", &maior);
for (i = 1; i < n; i++) {
printf("Digite um numero: ");
scanf("%d", &aux);
if (aux > maior)
maior = aux;
}
printf("Maior numero: %d\n", maior);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 8 / 65
![Page 8: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/8.jpg)
Soma de n numeros
Vamos escrever um programa que receba n numeros quaisquer ecalcule a soma deles.
Uma variavel soma ira armazenar a soma dos numeros lidos.
Ao ler um proximo numero, como atualizar a variavel soma?I soma = soma + numero;I soma += numero;
E importante lembrar que a variavel soma deve ser inicializada com ovalor zero (elemento neutro da soma).
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 10 / 65
![Page 9: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/9.jpg)
Soma de n numeros
#include <stdio.h>
int main() {
int n, i;
double aux, soma = 0;
printf("Quantidade de numeros: ");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
printf("Digite um numero: ");
scanf("%lf", &aux);
soma = soma + aux;
}
printf("Soma dos numeros: %.2f\n", soma);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 11 / 65
![Page 10: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/10.jpg)
Fatorial
Vamos escrever um programa que leia um numero inteiro positivo n ecalcule o valor do seu fatorial.
O programa deve ter os seguintes passos:1 Ler um numero n.2 Calcular n! = 1× 2× . . . (n − 1)× n
Como fazer este calculo?
Note que n nao e fixo, portanto, temos que usar comandos derepeticao.
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 13 / 65
![Page 11: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/11.jpg)
Fatorial
A ideia e criarmos uma variavel fatorial que na i-esima iteracao dolaco de repeticao possua o valor i !
Note que i ! = i × (i − 1)!, portanto, na i-esima iteracao podemosatualizar a variavel fatorial da seguinte maneira:
I fatorial = i × fatorial
Algoritmo:
fatorial(n)
fatorial = 1
para i de 1 ate n faca
fatorial = i * fatorial
imprimir fatorial
Note que a variavel fatorial deve ser inicializada com o valor um(elemento neutro da multiplicacao).
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 14 / 65
![Page 12: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/12.jpg)
Fatorial
#include <stdio.h>
int main() {
int n, i;
unsigned int fatorial = 1;
printf("Digite numero inteiro (nao negativo): ");
scanf("%d", &n);
for (i = 1; i <= n; i++)
fatorial = fatorial * i;
printf("%d! = %u\n", n, fatorial);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 15 / 65
![Page 13: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/13.jpg)
Fatorial
No exemplo anterior, o fatorial e calculado corretamente para n ≤ 14,entretanto, falha para n ≥ 15.
Por que? Como resolver este problema?
I Podemos trocar o tipo da variavel fatorial de unsigned int paraunsigned long int ou mesmo por double.
I Com unsigned long int e possıvel calcular corretamente ate ofatorial de 20, enquanto que, com double, ate 170 (neste caso, comperda de precisao numerica).
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 16 / 65
![Page 14: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/14.jpg)
Fatorial
#include <stdio.h>
int main() {
unsigned short int n, i;
unsigned long int fatorial = 1;
printf("Digite numero inteiro (nao negativo): ");
scanf("%hu", &n);
for (i = 1; i <= n; i++)
fatorial = fatorial * i;
printf("%hu! = %lu\n", n, fatorial);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 17 / 65
![Page 15: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/15.jpg)
Fatorial
#include <stdio.h>
int main() {
unsigned short int n, i;
double fatorial = 1;
printf("Digite numero inteiro (nao negativo): ");
scanf("%hu", &n);
for (i = 1; i <= n; i++)
fatorial = fatorial * i;
printf("%hu! = %.0f\n", n, fatorial);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 18 / 65
![Page 16: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/16.jpg)
Maximo Divisor Comum (MDC)
O algoritmo de Euclides para o calculo do Maximo Divisor Comum(MDC) entre dois numeros inteiros positivos m e n, apresentado em300 a.C., e um dos algoritmos mais antigos do mundo.
O algoritmo pode ser resumido na seguinte formula:
mdc(m, n) =
{m, se n = 0
mdc(n,m % n), se n > 0
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 20 / 65
![Page 17: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/17.jpg)
Maximo Divisor Comum (MDC)
#include <stdio.h>
int main() {
int m, n, aux;
printf("Entre com dois numeros inteiros positivos: ");
scanf("%d %d", &m, &n);
while (n > 0) {
aux = n;
n = m % n;
m = aux;
}
printf("MDC = %d\n", m);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 21 / 65
![Page 18: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/18.jpg)
Numeros primos
Um numero e primo se ele tem exatamente dois divisores naturaisdistintos: o numero um e ele mesmo.
O programa deve ter os seguintes passos:1 Ler um numero n.2 Testar se nenhum dos numeros entre 2 e n − 1 divide n.
Lembre-se que o operador % retorna o resto da divisao inteira.
Portanto (a % b) e zero se, e somente se, b divide a.
Note que nao e necessario testar os numeros entre bn/2c+ 1 e n − 1.
De fato e possıvel testar menos numeros ainda...1 Se n = a× b, sendo n, a e b numeros naturais e a ≤ b, entao
a ≤√n ≤ b.
2 Logo, precisamos testar apenas os numeros inteiros entre 2 e b√nc.
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 23 / 65
![Page 19: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/19.jpg)
Numeros primos
primo(n)
aux = 2
primo = verdadeiro
enquanto primo e aux <= n/2 faca
se aux for um divisor de n ent~ao
primo = falso
aux = aux + 1
imprimir primo
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 24 / 65
![Page 20: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/20.jpg)
Numeros primos
#include <stdio.h>
int main() {
int n, aux, primo = 1;
printf("Digite um numero inteiro: ");
scanf("%d", &n);
for (aux = 2; aux <= n/2; aux++)
if ((n % aux) == 0)
primo = 0;
if (primo)
printf("Numero primo\n");
else
printf("Numero composto\n");
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 25 / 65
![Page 21: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/21.jpg)
Numeros primos
#include <stdio.h>
int main() {
int n, aux, primo = 1;
printf("Digite um numero inteiro: ");
scanf("%d", &n);
for (aux = 2; primo && (aux <= n/2); aux++)
if ((n % aux) == 0)
primo = 0;
if (primo)
printf("Numero primo\n");
else
printf("Numero composto\n");
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 26 / 65
![Page 22: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/22.jpg)
Numeros primos
#include <stdio.h>
#include <math.h>
int main() {
int n, aux, primo = 1;
printf("Digite um numero inteiro: ");
scanf("%d", &n);
for (aux = 2; primo && (aux <= sqrt(n)); aux++)
if ((n % aux) == 0)
primo = 0;
if (primo)
printf("Numero primo\n");
else
printf("Numero composto\n");
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 27 / 65
![Page 23: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/23.jpg)
Primeiros n numeros primos
Ja sabemos testar se um dado numero e primo.
Como fazer para imprimir os n primeiros numeros primos?
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 29 / 65
![Page 24: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/24.jpg)
Primeiros n numeros primos
#include <stdio.h>
int main() {
int aux, numero = 2, primos = 0, n, primo;
printf("Digite o numero de primos a serem calculados: ");
scanf("%d",&n);
while (primos < n) {
/* inserir aqui trecho de codigo que
verifica se o numero eh primo */
if (primo) {
printf("%d\n", numero);
primos++;
}
numero++;
}
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 30 / 65
![Page 25: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/25.jpg)
Primeiros n numeros primos
while (primos < n) {
/* inserir aqui trecho de codigo que
verifica se o numero eh primo */
if (primo) {
printf("%d\n", numero);
primos++;
}
numero++;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 31 / 65
![Page 26: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/26.jpg)
Primeiros n numeros primos
while (primos < n) {
primo = 1;
for (aux = 2; primo && (aux <= numero/2); aux++)
if (numero % aux == 0)
primo = 0;
if (primo) {
printf("%d\n", numero);
primos++;
}
numero++;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 32 / 65
![Page 27: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/27.jpg)
Primeiros n numeros primos
Note que o numero 2 e o unico numero par que e primo.
Podemos alterar o programa para primeiro imprimir o numero 2...
#include <stdio.h>
int main() {
int aux, numero, primos = 1, n, primo;
printf("Digite o numero de primos a serem calculados: ");
scanf("%d",&n);
if (n > 0) {
printf("%d\n", 2);
...
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 33 / 65
![Page 28: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/28.jpg)
Primeiros n numeros primos
... e depois imprimir os primos ımpares:
...
for (numero = 3; primos < n; numero = numero + 2) {
primo = 1;
for (aux = 2; primo && (aux <= numero/2); aux++)
if (numero % aux == 0)
primo = 0;
if (primo) {
printf("%d\n", numero);
primos++;
}
}
}
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 34 / 65
![Page 29: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/29.jpg)
Primeiros n numeros primos
... e depois imprimir os primos ımpares:
...
for (numero = 3; primos < n; numero = numero + 2) {
primo = 1;
for (aux = 3; primo && (aux <= numero/2); aux = aux + 2)
if (numero % aux == 0)
primo = 0;
if (primo) {
printf("%d\n", numero);
primos++;
}
}
}
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 35 / 65
![Page 30: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/30.jpg)
Fatoracao em numeros primos
Exemplos de fatoracoes em numeros primos:
I 90 = 2× 32 × 5I 107 = 107I 121 = 112
I 280 = 23 × 5× 7
Dado um numero inteiro positivo n, como fatora-lo em numerosprimos?
Podemos verificar todos os candidatos a fatores de n, ou seja,numeros menores ou iguais a n.
Seja fator o numero que esta sendo testado numa certa iteracao. Sefator for um divisor de n, entao imprima fator e divida n por fator .Caso contrario, incremente fator .
Note que nao e necessario testar se fator e um numero primo.
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 37 / 65
![Page 31: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/31.jpg)
Fatoracao em numeros primos
#include <stdio.h>
int main() {
int n, fator = 2;
printf("Digite um numero inteiro positivo: ");
scanf("%d", &n);
while (n > 1) {
if ((n % fator) == 0) {
printf("%d\n", fator);
n = n / fator;
} else
fator++;
}
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 38 / 65
![Page 32: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/32.jpg)
Numeros de Fibonacci
A serie de Fibonacci e a seguinte:I 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 . . .
Ou seja, o n-esimo termo da serie e dado pela seguinte formula:
F (n) =
1, se n = 1
1, se n = 2
F (n − 1) + F (n − 2), caso contrario
Como escrever um algoritmo para imprimir os primeiros n numeros daserie?
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 40 / 65
![Page 33: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/33.jpg)
Numeros de Fibonacci
fibonacci(n)
atual = 1
proximo = 1
para i de 1 ate n faca
imprimir atual
temp = atual + proximo
atual = proximo
proximo = temp
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 41 / 65
![Page 34: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/34.jpg)
Numeros de Fibonacci
#include <stdio.h>
int main() {
int n, i;
unsigned long int atual = 1, proximo = 1, temp;
printf("Digite um numero inteiro positivo: ");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
printf("%lu\n", atual);
temp = atual + proximo;
atual = proximo;
proximo = temp;
}
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 42 / 65
![Page 35: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/35.jpg)
Numeros de Fibonacci
#include <stdio.h>
int main() {
int n, i;
unsigned long int atual = 1, proximo = 1;
printf("Digite um numero inteiro positivo: ");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
printf("%lu\n", atual);
proximo = atual + proximo;
atual = proximo - atual;
}
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 43 / 65
![Page 36: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/36.jpg)
Numeros Pitagoricos
Tres numeros inteiros positivos a, b e c formam um Trio Pitagorico sea2 + b2 = c2, ou seja, se existe um triangulo retangulo com catetos ae b e hipotenusa c .
Exemplos de Trios Pitagoricos:I (3, 4, 5), (5, 12, 13), (8, 15, 17), (7, 24, 25) e (15, 20, 25).
Um numero inteiro positivo c e dito um Numero Pitagorico seexistem inteiros positivos a e b tais que a2 + b2 = c2.
Exemplos de Numeros Pitagoricos:I 5, 13, 17 e 25.
Como verificar se um numero inteiro positivo e um NumeroPitagorico?
Como listar todos os Numeros Pitagoricos dentre um intervalo dadode numeros inteiros positivos?
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 45 / 65
![Page 37: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/37.jpg)
Numeros Pitagoricos
#include <stdio.h>
int main() {
int a, b, c;
printf("Entre com um numero inteiro positivo: ")
scanf("%d", &c);
for (a = 1; a < c; a++)
for (b = 1; b < c; b++)
if (a*a + b*b == c*c)
printf("%d^2 + %d^2 = %d^2\n", a, b, c);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 46 / 65
![Page 38: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/38.jpg)
Numeros Pitagoricos
#include <stdio.h>
int main() {
int a, b, c;
printf("Entre com um numero inteiro positivo: ")
scanf("%d", &c);
for (a = 1; a < c; a++)
for (b = a + 1; b < c; b++)
if (a*a + b*b == c*c)
printf("%d^2 + %d^2 = %d^2\n", a, b, c);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 47 / 65
![Page 39: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/39.jpg)
Numeros Pitagoricos
#include <stdio.h>
int main() {
int a, b, c, x, y;
printf("Entre com dois numeros inteiros positivos: ")
scanf("%d %d", &x, &y);
for (c = x; c <= y; c++)
for (a = 1; a < c; a++)
for (b = a + 1; b < c; b++)
if (a*a + b*b == c*c)
printf("%d^2 + %d^2 = %d^2\n", a, b, c);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 48 / 65
![Page 40: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/40.jpg)
O Ultimo Teorema de Fermat
Em 1637, Pierre de Fermat conjecturou que nao existem inteirospositivos a, b e c tais que ak + bk = ck , para nenhum inteiro k > 2.
“Eu descobri uma demonstracao maravilhosa, mas a margem destepapel e muito pequena para conte-la” – Pierre de Fermat (comentarioescrito nas de margens de um de seus livros, “Aritmetica deDiofante”).
Em 1995, 358 anos depois de ser proposto, o teorema foi provado porAndrew Wiles.
Este teorema foi incluıdo no “Guinness World Records” como “o maisintricado problema matematico da historia”.
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 49 / 65
![Page 41: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/41.jpg)
Conversao de numeros binarios para decimais
“There are 10 types of people in the world: those who understandbinary and those who don’t.” – Unknown
Sabemos que um computador armazena todas as informacoes naforma binaria, portanto, e util saber como converter numerosdecimais em binarios (e vice-e-versa).
Dado um numero binario bnbn−1 . . . b2b1b0, este corresponde naforma decimal a:
n∑i=0
bi × 2i
Exemplos:101 = 22 + 20 = 5
1001110100 = 29 + 26 + 25 + 24 + 22 = 512 + 64 + 32 + 16 + 4 = 628
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 51 / 65
![Page 42: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/42.jpg)
Conversao de numeros binarios para decimais
Vamos supor que lemos um inteiro binario.
Ou seja, ao lermos n = 111 assumimos que este e um numero binario(e nao “cento e onze”).
Como transformar este numero no correspondente valor decimal (7,neste caso)?
Podemos usar a expressao:
n∑i=0
bi × 2i
Para isso, entretanto, devemos conseguir recuperar os dıgitos binarios(bits) individualmente.
Note que:I n % 10 recupera o ultimo dıgito de n.I n = n / 10 remove o ultimo dıgito de n.
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 52 / 65
![Page 43: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/43.jpg)
Conversao de numeros binarios para decimais
#include <stdio.h>
int main() {
unsigned long int n, bit, dec = 0, pot = 1;
printf("Digite um numero binario: ");
scanf("%lu", &n);
while (n > 0) {
bit = n % 10;
n = n / 10;
dec = dec + (bit * pot);
pot = pot * 2;
}
printf("%lu\n", dec);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 53 / 65
![Page 44: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/44.jpg)
Conversao de numeros decimais para binarios
Agora, dado um numero em decimal, como obter o correspondenteem binario?
Qualquer numero pode ser escrito como uma soma de potencias de 2:
6 = 1× 22 + 1× 21 + 0× 20
13 = 1× 23 + 1× 22 + 0× 21 + 1× 20
O que acontece se dividirmos, sucessivamente, um numero decimalpor 2?
Vamos testar com o numero 13:
13/2 = 6, com resto 1
6/2 = 3, com resto 0
3/2 = 1, com resto 1
1/2 = 0, com resto 1
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 55 / 65
![Page 45: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/45.jpg)
Conversao de numeros decimais para binarios
#include <stdio.h>
int main() {
unsigned long int n, bit, bin = 0, pot = 1;
printf("Digite um numero decimal: ");
scanf("%lu", &n);
while (n > 0) {
bit = n % 2;
n = n / 2;
bin = bin + (bit * pot);
pot = pot * 10;
}
printf("%lu\n", bin);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 56 / 65
![Page 46: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/46.jpg)
Numero de letras de uma sequencia de caracteres
Considere o seguinte problema: dada uma sequencia de caracteres emuma unica linha (uma frase, por exemplo), determinar o seu numerode letras.
Exemplo:I Entrada: Um4 seQu3nc!4de c4r4ct3r3SI Saıda: 16 letras
Como determinar se um caractere e uma letra?I Letras maiusculas: de 65 (’A’) a 90 (’Z’) na tabela ASCIII Letras minusculas: de 97 (’a’) a 122 (’z’) na tabela ASCII
Como determinar o fim da sequencia de caracteres?
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 58 / 65
![Page 47: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/47.jpg)
Numero de letras de uma sequencia de caracteres
#include <stdio.h>
int main() {
char c;
int letras = 0;
printf("Digite uma frase: ");
do {
scanf("%c", &c);
if (((c >= 65) && (c <= 90)) || ((c >= 97) && (c <= 122)))
letras++;
} while (c != ’\n’);
printf("%d letras\n", letras);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 59 / 65
![Page 48: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/48.jpg)
Numero de letras de uma sequencia de caracteres
#include <stdio.h>
int main() {
char c;
int letras = 0;
printf("Digite uma frase: ");
do {
scanf("%c", &c);
if (((c >= ’A’) && (c <= ’Z’)) || ((c >= ’a’) && (c <= ’z’)))
letras++;
} while (c != ’\n’);
printf("%d letras\n", letras);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 60 / 65
![Page 49: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/49.jpg)
Jogo de dados
Suponha que queremos imprimir todas as possibilidades de resultadosao se jogar 4 dados de 6 faces.
Para cada possibilidade do primeiro dado, devemos imprimir todas aspossibilidades dos 3 dados restantes.
Para cada possibilidade do primeiro e do segundo dado, devemosimprimir todas as possibilidades dos 2 dados restantes e assim pordiante.
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 62 / 65
![Page 50: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/50.jpg)
Jogo de dados
#include <stdio.h>
int main() {
int d1, d2, d3, d4;
printf("D1 D2 D3 D4\n");
for (d1 = 1; d1 <= 6; d1++)
for (d2 = 1; d2 <= 6; d2++)
for (d3 = 1; d3 <= 6; d3++)
for (d4 = 1; d4 <= 6; d4++)
printf("%d %d %d %d\n", d1, d2, d3, d4);
return 0;
}
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 63 / 65
![Page 51: Primeiro Semestre de 2016 - Instituto de Computaçãordahab/mc102/Welcome_files/... · 2016-04-08 · Primeiro Semestre de 2016. Roteiro 1 Maior nume ro 2 Soma de n numeros 3 Fatorial](https://reader034.vdocuments.net/reader034/viewer/2022042304/5ecf39bc5c3fc722990ee896/html5/thumbnails/51.jpg)
Exercıcios
Um numero inteiro positivo e dito perfeito se a soma dos seusdivisores positivos (excluindo ele mesmo) e igual ao proprio numero.Dado um numero inteiro positivo n, escreva um programa quedetermine se ele e perfeito.
Dado um numero x qualquer e um numero inteiro nao negativo n,escreva um programa para calcular o valor de xn, sem usar abiblioteca matematica.
Dados dois numeros x e y (x ≥ 1, y > 1), escreva um programa paracalcular o valor de blogy xc, sem usar a biblioteca matematica.
Escreva um programa que, dados dois numeros inteiros positivos,calcule o Mınimo Multiplo Comum (MMC) deles.
Dada uma sequencia de n numeros, determine se ela e uma sequenciade numeros crescentes.
Dado um numero inteiro positivo n escrito na base x , converta-o paraa base y , sendo que x e y tambem sao fornecidos como entrada doseu programa (2 ≤ x , y ≤ 10).
Instituto de Computacao (UNICAMP) MC102 Primeiro Semestre de 2016 65 / 65