Buscar

Exemplos - Programação C

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 36 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 36 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 36 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Site da USP - INTEIROS
Dada uma seqüência de números inteiros não-nulos, seguida por 0, imprimir seus quadrados. 
#include <stdio.h>
int main() {
 int numero, /* usada para leitura da sequencia */
 quadrado; /* guarda o quadrado do numero lido */
 
 printf("\n\tCalculo dos quadrados de uma sequencia de numeros\n");
 printf("\nEntre com uma sequencia de numeros inteiros nao-nulos, seguida por 0:\n");
 scanf("%d", &numero);
 
 while (numero != 0) {
 quadrado = numero * numero;
 printf("O quadrado do numero %d e' %d\n", numero, quadrado);
 scanf("%d", &numero);
 }
 return 0;
}
Dado um número inteiro positivo n, calcular a soma dos n primeiros números inteiros positivos. 
SOLUÇÃO 1
#include <stdio.h>
int main() {
 int n, /* guarda o numero dado */
 i, /* contador */
 soma; /* guarda as somas parcias */
 printf("\n\tCalculo da soma dos n primeiros inteiros positivos\n");
 
 /* Inicializacoes */
 printf("\nDigite o valor de n: ");
 scanf("%d", &n);
 soma = 0;
 i = 1;
 
 /* Calculo da soma */
 while (i <= n) {
 soma = soma + i;
 i = i + 1;
 }
 
 /* Escreve a resposta */
 printf("A soma dos %d primeiros inteiros positivos e' %d\n", n, soma);
 return 0;
}
SOLUÇÃO 2 
#include <stdio.h>
int main() {
 int n, /* guarda o numero dado */
 soma; /* guarda as somas parcias */
 
 printf("\n\tCalculo da soma dos n primeiros inteiros positivos\n");
 
 /* Inicializacoes */
 printf("\nDigite o valor de n: ");
 scanf("%d", &n);
 
 /* Calcula a soma */
 soma = (n * (n + 1)) / 2;
 
 /* Escreve a resposta */
 printf("A soma dos %d primeiros inteiros positivos e' %d\n", n, soma);
 return 0;
}
Dado um número inteiro positivo n, imprimir os n primeiros naturais ímpares.
Exemplo: Para n=4 a saída deverá ser 1,3,5,7. 
#include <stdio.h>
int main() {
 int n, /* guardara o numero dado */
 i, /* contador = quantidade de impares ja' impressos */
 impar; /* usado para gerar a sequencia de numeros impares */ 
 
 printf("\n\tGerador de numeros impares\n");
 
 /* Inicializacoes */
 printf("\nDigite o valor de n: ");
 scanf("%d", &n);
 i = 0;
 impar = 1; 
 
 printf("Os %d primeiros impares sao:\n", n);
 while (i < n) {
 printf ("%d\n", impar);
 impar = impar + 2; /* vai para o proximo impar */
 i = i + 1;
 } 
 return 0;
}
Dados um inteiro x e um inteiro não-negativo n, calcular x n. 
#include <stdio.h>
int main() {
 int x, /* base */ 
 n, /* expoente */
 potencia, /* guarda as potencias parciais */ 
 contador; 
 
 printf("\n\tCalculo de potencias\n");
 printf("\nDigite um numero inteiro: ");
 scanf("%d", &x);
 printf("Digite um numero um inteiro nao-negativo: ");
 scanf("%d", &n);
 
 /* Inicializacoes */
 potencia = 1;
 contador = 0;
 
 /* Calculo da potencia */
 while (contador != n) {
 potencia = potencia * x;
 contador = contador + 1;
 }
 printf("\nO valor de %d elevado a %d: %d\n", x, n, potencia);
 return 0;
}
Uma loja de discos anota diariamente durante o mês de março a quantidade de discos vendidos. Determinar em que dia desse mês ocorreu a maior venda e qual foi a quantidade de discos vendida nesse dia. 
SOLUÇÃO COM APENAS LAÇO
#include <stdio.h>
Int main () {
int n, /* guarda o n´umero de dias */
dia, /* guarda o dia da maior venda */
contador, /* n´umero de dia j´a lidos */
maiorvenda,/* guarda a maior venda */
quantidade;/* usada para a leitura das quantidades */
printf("\n\tCalculo de maior venda \n");
printf("\nDigite o n´umero de dias: ");
scanf("%d", &n);
printf("\n");
printf("Digite a quantidade vendida no dia: ");
scanf("%d", &quantidade);
maiorvenda = quantidade;
dia = 1;
/* Calculo de maior venda */
for (contador = 2; contador <= n; contador++) {
	printf("Digite a quantidade vendida no dia: ");
	scanf("%d", &quantidade);
	if (maiorvenda < quantidade) {
		maiorvenda = quantidade;
		dia = contador;
	}
}
printf("\n");
printf("A maior venda foi %d discos no dia %d\n",
maiorvenda, dia);
return 0;
}
SOLUÇÃO COM LAÇO E VETOR
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
int main(void) {
 int vendas[28];
 int dia;
 int maior = 0;
 int i;
 
 for(i=1;i<=28;i++) {
 printf("Vendas no dia %d = ",i);
 scanf("%d",&vendas[i]);
 }
 
 for(i=1;i<=28;i++) {
 if (vendas[i] > maior) {
 maior = vendas[i];
 dia = i;
 } 
 }
 printf("Dia do mes com maior numero de vendas= %d\n",dia);
 printf("Quantidade de discos vendidos = %d\n",maior);
 system("pause"); 
}
Dados o número n de alunos de uma turma de Introdução aos Autômatos a Pilha (MAC 414) e suas notas da primeira prova, determinar a maior e a menor nota obtidas por essa turma (Nota máxima = 100 e nota mínima = 0). 
#include <stdio.h>
int main() {
 int n, /* guarda o numero de alunos */
 nota, /* usada para a leitura das notas */
 contador, /* numero de notas ja' lidas */
 notamaior, /* guarda a maior nota */
 notamenor; /* gurada a menor nota */ 
 
 printf("\n\tCalculo de maior e menor nota de uma turma\n");
 printf("\nDigite o numero de alunos: ");
 scanf("%d", &n);
 
 /* inicializacoes */
 contador = 0;
 notamaior = 0;
 notamenor = 100;
 
 while (contador < n) {
 printf("Digite uma nota (0 a 100): "); 
 scanf("%d", ¬a);
 contador = contador + 1;
 if (notamaior < nota)
 notamaior = nota;
 if (notamenor > nota)
 notamenor = nota;
 }
 printf("A maior nota obtida foi: %d\n", notamaior);
 printf("A menor nota obtida foi: %d\n", notamenor);
 return 0;
}
Dado um inteiro não-negativo n, determinar n! 
SOLUCAO 1: calcula 1*2*3...*n, nessa ordem.
#include <stdio.h>
int main() {
 int n, /* guarda o numero dado */
 contador, 
 fatorial; 
 
 printf("\n\tCalculo do fatorial de um numero\n");
 printf("\nDigite um inteiro nao-negativo: ");
 scanf("%d", &n);
 
 /* inicializacoes */
 fatorial = 1;
 contador = 2;
 
 while (contador <= n) {
 fatorial = fatorial * contador;
 contador = contador + 1;
 }
 printf("O valor de %d!: %d\n", n, fatorial);
 
 return 0;
}
SOLUCAO 2: usa o comando for e calcula 1*2*3*...*(n-1) nessa ordem.
#include <stdio.h>
int main() {
 int n, /* guarda o numero dado */
 i, 
 nfat; 
 
 printf("\n\tCalculo do fatorial de um numero\n");
 printf("\nDigite um inteiro nao-negativo: ");
 scanf("%d", &n);
 
 /* inicializacoes */
 nfat = 1;
 
 for (i = 2; i <= n; i++) { /* as chave sao superfluas */
 nfat = nfat * i;
 }
 
 printf("O valor de %d!= %d\n", n, nfat);
 return 0;
}
SOLUCAO 3: usa o comando for e calcula 1*n*(n-1)*(n-2)...*2,nessa ordem.
#include <stdio.h>
int main() {
 int n, /* guarda o numero dado */
 i, 
 nfat; 
 
 printf("\n\tCalculo do fatorial de um numero\n");
 printf("\nDigite um inteiro nao-negativo: ");
 scanf("%d", &n);
 
 /* inicializacoes */
 nfat = 1;
 
 for (i = n; i > 1; i--) { /* as chave sao superfluas */
 nfat = nfat * i;
 } 
 printf("O valor de %d!= %d\n", n, nfat);
 return 0;
}
Dados n e dois números inteiros positivos i e j diferentes de 0, imprimir em ordem crescente os n primeiros naturais que são múltiplos de i ou de j e ou de ambos.
 Exemplo: Para n = 6 , i = 2 e j = 3 a saída deverá ser : 0,2,3,4,6,8. 
SOLUCAO 1: Simples, curta e grossa.
Testa os numeros 0, 1, 2, ... verifincando quais sao multiplos de i ou j. 
#include <stdio.h>
int main() {
 int i, j, n, /*dados de entrada */
 mult, /* candidato a multiplo */
 cont; /* conta quantos multiplos foram impressos */
 
 printf("\n\tCalculo dos n primeiros multiplos de i ou de j\n");
 printf("\nDigite o numero de multiplos a serem impressos: ");
 scanf("%d", &n);
 printf("Digite os dois numeros: ");
 scanf("%d %d", &i, &j);
 
 /* inicializacoes */
 mult = 0;
 cont = 0; 
 
 printf("Os %d primeiros multiplos de %d ou de %d sao:", n, i, j);
 while (cont < n) {
 /* verifica se mult e' multiplo de i ou j */
 if (mult%i == 0 || mult%j == 0)	{
	 printf(" %d", mult);
 cont = cont + 1;;
	}
 /* vamos para o proximo candidato */ 
 mult = mult + 1; /* Hmmm, podia ter escrito mult++; */ 
 }
 printf("\n"); /* tire esta linha e veja a diferenca na saida*/
 return 0;
}
SOLUCAO 3: Mais elaborada. Faz menos iteracoes que a anterior. A cada iteracao imprime um multiplo de i ou j. Usa o comando for.
Os casos: (1) multi < multj;
 (2) multi > multj; e
 (3) multi == multj estao mais evidentes.
#include <stdio.h>
int main() {
 int i, j, n, /* dados de entrada */
 multi, multj, /* multiplos de i e multiplos de j */
 k; /* conta quantos multiplos foram impressos */
 
 printf("\n\tCalculo dos n primeiros multiplos de i ou de j\n");
 printf("\nDigite o numero de multiplos a serem impressos: ");
 scanf("%d", &n);
 printf("Digite os dois numeros: ");
 scanf("%d %d", &i, &j);
 
 /* inicializacoes */
 multi = 0;
 multj = 0;
 
 printf("Os %d primeiros multiplos de %d ou de %d sao:", n, i, j);
 for (k = 0; k < n; k++) {
 if (multi < multj) { /* Caso 1. multi < multj */
	 printf(" %d", multi);
	 multi = multi + i;
	}
 else if (multi > multj) { /* Caso 2. multi > multj */
	 printf(" %d", multj);
	 multj = multj + j; 
	}
 else { /* Caso 3. multi == multj */
 printf(" %d", multj);
 multi = multi + i;
 multj = multj + j;
	} 
 }
 printf("\n");
 return 0;
}
Dizemos que um número natural é triangular se ele é produto de três números naturais consecutivos.
Exemplo: 120 é triangular, pois 4.5.6 = 120.
Dado um inteiro não-negativo n, verificar se n é triangular. 
/* Programa que determina se um numero e' triangular */
#include <stdio.h>
int main() {
 int i, n;
 
 printf("Digite o valor de n: ");
 scanf("%d",&n);
 
 /* for com comando vazio! */
 for (i = 1; i*(i+1)*(i+2) < n; i++) ;
 
 if (i*(i+1)*(i+2) == n)
 printf("%d e' o produto %d*%d*%d\n", n, i, i+1, i+2);
 else
 printf("%d nao e' triangular\n", n);
 return 0;
}
Dado um inteiro positivo n, verificar se n é primo. 
SOLUCAO 2. Mais elaborada e eficiente.
Usa indicador de passagem, a variaval eprimo. Ao final do programa vale que eprimo == 0 se e somente se o numero dado nao e' primo.
Observacao. Um numero inteiro maior que 1 e primo se seus únicos divisores sao ele mesmo e 1. Assim, 1 nao e' primo.
#include <stdio.h>
int main() {
 int n; /* candidato a primo */
 int divisor; /* candidato a divisor de n */
 int eprimo; /* indica se n ainda tem chance de ser primo */
 printf("\n\tTeste de primalidade\n");
 printf("\nDigite um inteiro: ");
 scanf("%d", &n);
 printf ("Candidato a primo = %d\n", n); 
 /* inicializacoes */
 if (n <= 1) { 
 eprimo = 0; /* nenhum numero <= 1 e' primo */
 }
 else {
 eprimo = 1; /* o numero e' primo ate que se prove o contrario */
 }
 /* os candidatos a divisores positivos de n sao 1,2,...,n/2 */
 divisor = 2;
 while (divisor <= n/2 && eprimo == 1) {
 if (n % divisor == 0) 	{ 
	 eprimo = 0; /* n nao e' primo! */
	}
 divisor++;
 }
 printf("O inteiro %d ", n);
 if (eprimo == 1) { 
 printf("e' primo\n");
 }
 else {
 printf("nao e' primo\n");
 }
 return 0;
}
/* 
 
* SOLUCAO 5. Uma SOLUCAO COM FALSE E TRUE NO LUGAR DE 1 E 0 e um pouco mais compacta.
 * Usa comando for e a abreviatura += 
 * Observacao. Um numero inteiro maior que 1 e primo se seus únicos divisores sao ele mesmo e 1. Assim, 1 nao e' primo.
#include <stdio.h>
#define FALSE 0
#define TRUE 1
int main() {
 int n; /* candidato a primo */
 int divisor; /* candidato a divisor de n */
 int eprimo; /* indica se n ainda tem chance de ser primo */
 printf("\n\tTeste de primalidade\n");
 printf("\nDigite um inteiro: ");
 scanf("%d", &n);
 printf ("Candidato a primo = %d\n", n); 
 /* inicializacoes */
 if (n <= 1 || (n != 2 && n % 2 == 0)) { 
 eprimo = FALSE; /* nenhum numero inteiro <= 1 ou par > 2 e' primo */
 }
 else {
 eprimo = TRUE; /* o numero e' primo ate que se prove o contrario */
 }
 /* os candidatos a divisores positivos de n sao 3,5,7,...,n/2 */
 for (divisor = 3; divisor <= n/2 && eprimo == 1; divisor += 2) {
 if (n % divisor == 0) 	{ 
	 eprimo = FALSE; /* n nao e' primo! */
	}
 }
 printf("O inteiro %d ", n);
 if (eprimo == TRUE) { 
 printf("e' primo\n");
 }
 else {
 printf("nao e' primo\n");
 }
 return 0;
}
Dados dois números inteiros positivos, determinar o máximo divisor comum entre eles usando o algoritmo de Euclides.
  Exemplo:
#include <stdio.h>
int main() {
 int anterior, atual, resto;
 
 printf("Digite os dois inteiros positivos: ");
 scanf("%d %d" , &anterior, &atual);
 printf("MDC(%d,%d) = ", anterior, atual);
 
 resto = atual % anterior; /* Por que nao 'resto = anterior % atual;'? */
 while (resto != 0) {
 resto = anterior % atual;
 anterior = atual;
 atual = resto;
 } 
 printf("%d\n", anterior);
 return 0;
}
(MAT 89) Dizemos que um inteiro positivo n é perfeito se for igual à soma de seus divisores positivos diferentes de n.
Exemplo: 6 é perfeito, pois 1+2+3 = 6.
       Dado um inteiro positivo n, verificar se n é perfeito. 
/* Programa que determina se um numero e' perfeito */
#include <stdio.h>
int main() {
 int n, /* numero a ser verificado */
 soma, /* soma dos valores dos divisores de n */
 divisor; /* candidato a divisor de n */
 printf("Digite um numero inteiro positivo: ");
 scanf("%d", &n);
 
 /* inicializacoes */
 soma = 0;
 
 for (divisor = 1; divisor < n; divisor++){
 if (n % divisor == 0)
 soma = soma + divisor;
 }
 
 if (n == soma)
 printf("O numero %d e' perfeito\n", n);
 else 
 printf("O numero %d nao e' perfeito\n", n);
 return 0;
}
Um matemático italiano da idade média conseguiu modelar o ritmo de crescimento da população de coelhos (1) através de uma seqüência de números naturais que passou a ser conhecida como seqüência de Fibonacci (2). O n-ésimo número da seqüência de Fibonacci Fn é dado pela seguinte fórmula de recorrência:
          Faça um programa que, dado n, calcula Fn. 
/* Programa para calcular um determinado numero de Fibonacci */
#include <stdio.h>
int main() {
 int n, 
 fant, fatual, fprox, /* numeros de Fibonacci */
 contador; /* indica qual numero de Fibonacci esta' em fatual */
 
 printf("Digite um numero n: ");
 scanf("%d", &n);
 
 /* inicializacoes */
 fant = 0;
 fatual = 1;
 contador = 1;
 
 while (contador < n) {
 fprox = fatual + fant; /* proximo numero de Fibonacci */
 fant = fatual;
 fatual = fprox;
 contador = contador + 1;
 }
 printf("Numero %d de Finobacci = %d\n", n, fatual);
 return 0;
}
Dizemos que um número i é congruente módulo m a j se i % m = j % m. 
 
Exemplo: 35 é congruente módulo 4 a 39, pois 35 % 4 = 3 = 39 % 4.
Dados inteiros positivos n, j e m, imprimir os n primeirosnaturais congruentes a j módulo m.
SOLUCAO 1.
#include <stdio.h>
int main() {
 int n, m, j, /* dados de entrada */
 i; /* percorre os naturais */
 
 printf("Digite os valores de n, j e m: ");
 scanf("%d %d %d", &n, &j, &m);
 
 printf ("Os %d primeiros naturais congruentes a %d modulo %d sao: ",n, j, m);
 for (i = 0; n != 0; i++){ 
 if (i % m == j % m) {
 printf("%d ", i);
 n = n - 1;
 }
 }
 printf("\n");
 return 0;
}
SOLUCAO 2. 
#include <stdio.h>
int main() {
 int n, m, j, /* dados de entrada */
 c, /* numero congruente a j modulo m */
 i; /* contador de n�meros impressos */
 
 printf("Digite os valores de n, j e m: ");
 scanf("%d %d %d", &n, &j, &m);
 printf ("Os %d primeiros naturais congruentes a %d modulo %d sao: ",n, j, m);
 
 /* inicializacoes */
 c = j;
 
 for (i = 0; i < n; i++) {
 printf("%d ", c);
 c = c + m; /* passa para o proximo numero congruente a j modulo m */
 }
 printf("\n");
 return 0;
}
Dado um número natural na base binária, transformá-lo para a base decimal.
Exemplo:
Dado 10010 a saída será 18, pois 1. 2 4 + 0. 2 3 + 0. 2 2 + 1. 2 1 + 0. 2 0 = 18. 
/* Programa para converter da base 2 para a base 10 */
#include <stdio.h>
int main() {
 int num, /* numero dado (na base 2) */
 pot2, /* guardara uma potencia de 2 */
 final; /* numero dado convertido para base 10 */
 
 printf("Digite o numero a ser transformado da base 2 para a base 10: ");
 scanf("%d", &num);
 
 /* inicializacoes */
 final = 0;
 pot2 = 1;
 printf("%d na base 10 e': ", num);
 
 while (num != 0){
 final = final + num % 10 * pot2; /* processa um digito binario */
 num = num / 10;
 pot2 = pot2 * 2;
 }
 printf("%d\n", final);
 return 0;
}
 Dado um número natural na base decimal, transformá-lo para a base binária.
Exemplo: Dado 18 a saída deverá ser 10010. 
/* Programa para converter da base 10 para a base 2 */
#include <stdio.h>
int main() {
 int num, /* numero dado (na base decimal) */
 bin,	 /* numero dado convertido para base 2 */
 aux,	 /* auxiliar */
 dig,	 /* guardara cada um dos digitos binarios */
 pot; /* potencia de 10 */
 printf("Digite um numero natural: ");
 scanf("%d", &num);
 /* inicializacoes */
 aux = num;
 bin = 0;
 pot = 1;
 while (aux > 0) {
 dig = aux % 2; /* proximo digito binario menos significativo */
 aux = aux / 2; /* remove esse digito do que resta */
 bin = bin + dig * pot; /* adiciona o digito como o mais significativo */
 pot = pot * 10;
 }
 printf("O numero %d escrito na base binaria: %d\n", num, bin);
 return 0;
}
Dados três números naturais, verificar se eles formam os lados de um triângulo retângulo. 
/* Programa que testa se tres numeros sao os lados de um triangulo retangulo */
#include <stdio.h>
int main() {
 int a, b, c, /* dados de entrada */
 aux; /* auxiliar para fazer a troca */
 printf("Digite tres numeros naturais: ");
 scanf("%d", &a);
 scanf("%d", &b);
 scanf("%d", &c); 
 /* coloca o maior dos numeros dados no a */
 if (b > a){
 aux = a;
 a = b;
 b = aux;
 }
 if (c > a){
 aux = a;
 a = c;
 c = aux;
 } 
 /* verifica se b e c sao catetos de um triangulo com a de hipotenusa */
 if (a * a == b * b + c * c)
 printf("O triangulo � retangulo\n");
 else 
 printf("O triangulo n�o � retangulo\n");
return 0;
}
Dados três números, imprimi-los em ordem crescente. 
SOLUCAO 1. Simples, curta e grossa.
 
#include <stdio.h>
int main() {
 int n1, n2, n3; /* dados de entrada */ 
 printf("Digite tres numeros: ");
 scanf("%d %d %d", &n1, &n2, &n3);
 
 /* Existem 6 possiveis ordens para imprimior os numeros lidos */
 if (n1 <= n2 && n2 <= n3) {
 printf("A ordem crescente: %d %d %d\n", n1, n2, n3);
 }
 else if (n1 <= n3 && n3 <= n2) {
 printf("A ordem crescente: %d %d %d\n", n1, n3, n2);
 }
 else if (n2 <= n1 && n1 <= n3) {
 printf("A ordem crescente: %d %d %d\n", n2, n1, n3);
 }
 else if (n2 <= n3 && n3 <= n1) {
 printf("A ordem crescente: %d %d %d\n", n2, n3, n1);
 }
 else if (n3 <= n1 && n1 <= n2) {
 printf("A ordem crescente: %d %d %d\n", n3, n1, n2);
 }
 else /* n3 <= n2 && n2 < n1 */ {
 printf("A ordem crescente: %d %d %d\n", n3, n2, n1);
 }
 return 0;
}
SOLUCAO 3. Igual a solucao 2 com alguns parenteses superfluos que devem ajudar a leitura do programa (evitar ambiguida).
#include <stdio.h>
int main() {
 int n1, n2, n3; /* dados de entrada */
 printf("Digite tres numeros: ");
 scanf("%d", &n1);
 scanf("%d", &n2);
 scanf("%d", &n3);
 
 if (n3 > n1) {
 if (n1 > n2)	{
	 printf("A ordem crescente: %d %d %d\n", n2, n1, n3);
	}
 else 	{
	 if (n2 < n3)
	 {
	 printf("A ordem crescente: %d %d %d\n", n1, n2, n3);
	 }
	}
 } 
 if (n1 > n2) {
 if (n2 > n3)	{
	 printf("A ordem crescente: %d %d %d\n", n3, n2, n1);
	}
 else 	{
	 if (n3 < n1)	 {
	 printf("A ordem crescente: %d %d %d\n", n2, n3, n1);
	 }
	}
 }
 if (n1 < n2) {
 if (n3 < n1)	{
	 printf("A ordem crescente: %d %d %d\n", n3, n1, n2);
	}
 else 	{
	 if (n3 < n2)	 {
	 printf("A ordem crescente: %d %d %d\n", n1, n3, n2);
	 }
	}
 }
 return 0;
}
(FIS 88) Qualquer número natural de quatro algarismos pode ser dividido em duas dezenas formadas pelos seus dois primeiros e dois últimos dígitos.
Exemplos: 1297: 12 e 97.[
 5314: 53 e 14.
Escreva um programa que imprime todos os milhares (4 algarismos) cuja raiz quadrada seja a soma das dezenas formadas pela divisão acima.
Exemplo: raiz de 9801 = 99 = 98 + 01. 
Portanto 9801 é um dos números a ser impresso.
#include <stdio.h>
 int main(){
  int i,d1,d2;
 
  for(i = 1000; i <= 9999; i += 1){
    d1 = i%100;
    d2 = i/100;
    if( (d1+d2)*(d1+d2) == i )
      printf("%d\n",i);
  }
  return 0;
}
 (POLI 87) Dados n e uma sequência de n números inteiros, determinar quantos segmentos de números iguais consecutivos compõem essa seqüência.
Exemplo: A seguinte seqüência é formada por 5 segmentos de números iguais:   5,  2,  2,  3,  4,  4,  4,  4,  1,  1 
 /* Programa que conta segmentos de numeros iguais */
#include <stdio.h>
int main() {
 int n, /* comprimento da sequencia */
 i, /* contador de numeros da sequencia lidos */
 atual, /* ultimo numero da sequencia lido */
 anterior, /* numero anterior da sequencia */
 cont; /* quantidade de segmentos de numeros iguais na sequencia */ 
 printf("Digite o numero de elementos da sequencia: ");
 scanf("%d",&n);
 printf("Digite uma sequencia com %d numeros inteiros: ", n);
 /* inicializacoes */
 scanf("%d", &anterior); /* anterior comeca com o primeiro da sequencia */
 cont = 1; /* inicialmente temos um segmento */
 for (i = 2; i <= n; i++) {
 scanf("%d", &atual); /* proximo da sequencia */
 if (atual != anterior){ 
 cont = cont + 1; /* comecou um novo segmento de numeros iguais */
 anterior = atual;
 }
 }
 printf("Quantidade de segmentos de numeros iguais da sequencia = %d\n", cont);
 return 0;
}
(POLI 89) Dados n e uma seqüência de n números inteiros, determinar o comprimento de um segmento crescente de comprimento máximo.
Exemplos:
Na seqüência   5,  10,  3,  2,  4,  7,  9,  8,  5   o comprimento do segmento crescente máximoé 4.
Na seqüência   10,  8,  7,  5,  2   o comprimento de um segmento crescente máximo é 1. 
/* Programa que conta o numero de segmentos crescentes */
#include <stdio.h>
int main() {
 int n, /* comprimento da sequencia */
 num, /* um numero da sequencia */
 ant, /* numero anterior da sequencia */
 comp, /* comprimento do segmento sendo analisado */
 compmax, /* comprimento do segmento crescente maximo */
 i; /* quantidade de n�meros da sequencia lidos */
 printf("Digite o numero de elementos da sequencia: ");
 scanf("%d", &n);
 printf("Digite uma sequencia com %d numeros inteiros: ", n);
 /* inicializacoes */
 scanf("%d", &ant); /* ant comeca com o primeiro da sequencia */ 
 comp = 1; 
 compmax = 1;
 for (i = 1; i < n; i++) {
 scanf("%d", &num);
 if (num > ant) {
 comp = comp + 1;
 if (compmax < comp) 
 compmax = comp;
 }
 else
 comp = 1; /* comecou um novo segmento crescente */
 ant = num;
 }
 printf("O comprimento do segmento crescente maximo: %d\n", compmax);
 return 0;
}
Dizemos que um número natural n é palíndromo (3) se o 1º algarismo de n é igual ao seu último algarismo, o 2º algarismo de n é igual ao penúltimo algarismo, e assim sucessivamente.
Exemplos: 567765 e 32423 são palíndromos.
 567675 não é palíndromo.
Dado um número natural   n > 10 , verificar se n é palíndrome. 
/* Programa que verifica se um numero � palindrome */
#include <stdio.h>
int main() {
 int num, /* numero dado */
 aux, /* guarda o pedaco do numero que resta inverter */
 reverso; /* guarda o numero de tras para frente */
 printf("Digite um natural: ");
 scanf("%d", &num);
 /* inicializacoes */
 aux = num;
 reverso = 0;
 while (aux != 0) {
 reverso = reverso * 10 + aux % 10; /* acrescenta mais um digito a direita */
 aux = aux / 10; /* joga fora esse digito */
 }
 if (reverso == num)
 printf("%d e' palindrome\n", num);
 else
 printf("%d nao e' palindrome\n", num);
 return 0;
}
São dados dois números inteiros positivos p e q, sendo que o número de dígitos de p é menor ou igual ao número de dígitos de q. Verificar se p é um subnúmero de q.
Exemplos: p = 23, q = 57238, p é subnúmero de q.
p = 23, q = 258347, p não é subnúmero de q.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define TRUE 1 
#define FALSE 0 
int main() { 
int p, q; /* dados do problema */ 
int pot10; /* guardara a menor potencia de 10 maior que p */ 
int qaux; /* variavel auxiliar; usada para `descascar' q */
int subnumero; /* guarda um subnumero de q */ 
int achou; /* indica se achou em q um subnumero igual a p */ 
/* 0. leia os dados */ 
printf("Digite um numero P:"); 
scanf("%d",&p); 
printf("Digite um numero Q maior em extensao que P:"); 
scanf("%d",&q); 
/* 1. determine a menor potencia de 10 maior que p */ 
pot10 = 1; 
while (pot10 <= p){ 
pot10 = pot10 * 10; 
} 
/* 2. verifique se algum subnumero de q e igual a p */ 
achou = FALSE; 
qaux = q; 
while (qaux >= p && achou == FALSE){ 
subnumero = qaux%pot10; 
qaux = qaux/10; 
if (subnumero == p){
 achou = TRUE; 
} 
}
if (achou == TRUE){ 
printf("%d eh subnumero de %d\n", p, q); 
}
else{ 
printf("%d nao eh subnumero de %d\n", p, q); 
} 
system("pause"); 
return 0; 
}
Simule a execução do programa abaixo destacando a sua saída:
int main() {
  int a, b, total, soma, termo, i;
  printf("Digite um par de numeros: ");
  scanf("%d %d", &a, &b);
  printf("(%d, %d)\n", a, b);
  total = 0; 
  soma  = 0;
  while (a != 0) { 
    total = total + 1; 
    termo = 1;
    for (i = 1; i <= b; i++)
      termo = termo * a;
    printf("Resp = %d\n", termo);
    soma = soma + termo;
    printf("Soma = %d\n", soma);
    printf("Digite um par de numeros: ");
    scanf("%d %d", &a, &b);
    printf("(%d, %d)\n", a, b);
  }
  printf("Total de pares: %d\n", total);
  return 0;
}
Dados: 
    2    3 
    5    2 
    7    1 
    0    5 
    3    2 
SIMULAÇÃO
Digite um par de numeros: 2 3
(2, 3)
Resp = 8
Soma = 8
Digite um par de numeros: 5 2
(5, 2)
Resp = 25
Soma = 33
Digite um par de numeros: 7 1
(7, 1)
Resp = 7
Soma = 40
Digite um par de numeros: 0 5
(0, 5)
Total de pares: 3
Site da USP – REAIS
1.  Uma pessoa aplicou um capital de x complexos (1) a juros mensais de z durante 1 ano. Determinar o montante de cada mês durante este período. 
#include <stdio.h>
int main() {
 float 
 inicial, /* capital aplicado */
 juros, /* taxa de juros */
 fator, /* taxa de correcao */
 capital; /* capital corrente */
 int 
 mes; /* contador de meses */
 
 printf("Digite o valor do capital aplicado: ");
 scanf("%f", &inicial);
 
 printf("Digite o valor dos juros (em %%): ");
 scanf("%f", &juros);
 /* inicializacoes */
 fator = 1 + juros / 100;
 capital = inicial;
 printf("\nValor aplicado: R$%.2f\n", inicial); 
 for (mes = 1; mes <= 12; mes++){
 capital *= fator;
 printf("Valor ao final do mes %2d: R$%.2f\n", mes, capital); 
 }
 
 return 0;
}
2.  Dado um natural n, determine o número harmônico Hn definido por:
/* Programa para calcular o numero harmonico de uma certa ordem */
#include <stdio.h>
int main() {
 float Hn; /* numero harmonico de ordem n */
 int n, k;
 
 printf("Digite o valor de n: ");
 scanf("%d", &n);
 
 Hn = 0;
 for (k = 1; k <= n; k++)
 Hn += (float)1/k;
 
 printf("Valor de H_%d: %f\n", n, Hn);
 return 0;
}
3.  Os pontos (x,y) que pertencem à figura H (abaixo) são tais que   x > 0,   x > 0   e   x2 + y2 < 1.
Dados n pontos reais (x,y), verifique se cada ponto pertence ou não a H.
/* Programa que verifica a pertinencia de um ponto a uma certa regiao */
#include <stdio.h>
int main() {
 int i, n;
 float x, y;
 
 printf("Digite o numero de pontos: ");
 scanf("%d", &n);
 
 for (i = 0; i < n; i++){
 printf("Digite as coordenadas de um ponto: ");
 scanf("%f %f", &x, &y); 
 if (x >= 0 && y >= 0 && x*x + y*y <= 1)
 printf("O ponto (%f,%f) pertence a regiao.\n", x, y);
 else
 printf("O ponto (%f,%f) nao pertence a regiao.\n", x, y);
 }
 return 0;
}
4.  (GEO 84) Considere o conjunto  de pontos reais, onde
Faça um programa que lê uma seqüência de n pontos reais (x,y) e verifica se cada ponto pertence ou não ao conjunto H. O programa deve também contar o número de pontos da seqüência que pertencem a H. 
#include <stdio.h>
#include <stdlib.h>
int main () {
int n, i, cont=0;
float x, y;
printf("Digite a quantidade de pontos:" );
scanf("%d",&n);
for(i=0;i<n;i++){
printf("Digite o ponto (x y): ");
scanf("%f %f",&x,&y);
	if((x<=0)&&(y<=0)&&(y+x*x+2*x-3<=0)){
		printf("%.2f, %.2f pertence a H\n", x,y);
		cont++;
	}
	else {
		if((x>=0)&&(y+x*x-2*x-3<=0)){
		printf("%.2f, %.2f pertence a H\n", x,y);
		cont++;
		}
		else {
		printf("%.2f, %.2f não pertence a H\n", x,y);
		}
	}
}
printf("\n%d ponto(s) pertence(m) a H.",cont);
return 0;
}
5.  Dados números reais a, b e c, calcular as raízes de uma equação do 2o grau da forma ax2 + bx + c = 0. Imprimir a solução em uma das seguintes formas:
 a.DUPLA        b.REAIS DISTINTAS     c.COMPLEXAS 
   raiz           raiz 1                parte real 
                  raiz 2                parte imaginária
Observação: Em C, para extrair raiz quadrada use a função sqrt (coloque #include <math.h> antes do main). 
#include <stdio.h>
#include <math.h>
int main() {
 float 
 a, b, c, /* coeficientes da equacao */
 delta, rdelta, 
 parte_real, /* parte real das raizes*/
 parte_imaginaria, /* parte imaginaria das raizes */
 raiz1, raiz2; /* raizes, caso sejam reais */
 int raizes; /* indica de que tipo sao as raizes */
 printf("\n\tCalculo das raizes da equacao ax^2+bx+c=0\n");
 printf("\nDigite os numeros a, b e c: ");
 scanf("%f %f %f",&a, &b, &c);
 /* calculo do delta da equacao */
 delta = b*b-4*a*c;
 if (delta > 0) {
 /* a equacao tem raizes reais */
 rdelta = sqrt(delta);
 raiz1 = (-b+rdelta)/(2*a);
 raiz2 = (-b-rdelta)/(2*a);
 printf("Raizes reais\n");
 printf("Raiz 1: %f\n", raiz1);
 printf("Raiz 2: %f\n", raiz2);
 }
 else if (delta < 0) {
 /* a equacao tem raizes complexas */
 rdelta = sqrt(-delta);
 parte_real = -b/(2*a);
 parte_imaginaria = delta/(2*a);
 printf("Raizes complexas\n");
 printf("Parte real: %f\n", parte_real);
 printf("Parte imaginaria: %f\n", parte_imaginaria);
 }
 else {
 /* a equacao tem raiz dupla */
 printf("Raiz dupla: %f\n", -b/(2*a));
 }
 return 0;
}
6.  Dados x real e n natural, calcular uma aproximação para cos x através dos n primeiros termos da seguinte série:
Compare com os resultados de sua calculadora! 
#include <stdio.h>
#include <math.h> // <=== para fazer o calculo de cos(x) usando a funcao cos(.)
 // da biblioteca math. Veja o ultimo printf.
int main() {
 int n, k;
 double fatorial, x, cosx, termo;
 // Veja: fatorial declarado como 'double'
 printf("Forneça o valor do ângulo em radianos: ");
 scanf("%lf", &x);
 printf("Número de termos: ");
 scanf("%d", &n);
 cosx = 1.0;
 fatorial = 1.0; 
 termo = 1.0;
 for (k = 1; k < n; k++) {
 termo = - (termo * x * x); // veja o sinal 
 fatorial = fatorial * (2 * k -1) * (2 * k); //<==== calculo do fatorial
 // aproveitando o fatorial anterior.
 cosx = cosx + termo/fatorial; 
 }
 printf("cos(%g) = %g\n", x, cosx);
 printf("Usando a funcao cos(.) ja' disponivel: cos(%g) = %g\n", x, cos(x));
 return 0;
}
8.  Para n alunos de uma determinada classe são dadas as 3 notas das provas. Calcular a média aritmética das provas de cada aluno, a média da classe, o número de aprovados e o número de reprovados (critério de aprovação: média maior ou igual a cinco). 
#include <stdio.h>
int main() {
 int n, i, Aprovados, Reprovados;
 float Nota1, Nota2, Nota3, Media, MediaDaClasse;
 
 printf("Digite o numero de alunos: ");
 scanf("%d", &n);
 /* inicializacoes */
 Aprovados = 0;
 Reprovados = 0;
 MediaDaClasse = 0.0;
 for (i = 1; i <= n; i++) {
 printf("Digite as 3 notas do aluno %d: ", i);
 scanf("%f", &Nota1);
 scanf("%f", &Nota2);
 scanf("%f", &Nota3);
 Media = (Nota1 + Nota2 + Nota3) / 3;
 printf("A media do aluno %d foi %f\n", i, Media);
 MediaDaClasse = MediaDaClasse + Media;
 if (Media >= 5.0)
 Aprovados = Aprovados + 1;
 else
 Reprovados = Reprovados + 1;
 }
 MediaDaClasse = MediaDaClasse / n;
 printf("O numero de alunos aprovados foi %d\n", Aprovados);
 printf("O numero de alunos reprovados foi %d\n", Reprovados);
 printf("A media da classe foi %f\n", MediaDaClasse);
 return 0;
}
11.  Dado um inteiro positivo n, calcular e imprimir o valor da seguinte soma:
#include <stdio.h>
int main() {
 float somaerrada, soma;
 int i, n; 
 printf("Digite o valor de n: ");
 scanf ("%d", &n); 
 somaerrada = 0;
 soma = 0;
 for (i = 0; i < n; i++) {
 somaerrada = somaerrada + (1+i)/(n-i);
 soma = soma + (float)(1+i)/(n-i);
 }
 printf("Valor da soma = %f\n", soma);
 printf("Valor errado, fazendo como soma de inteiros = %f\n", somaerrada);
 return 0;
}
12.  Faça um programa que calcula a soma
 pelas seguintes maneiras:
adição dos termos da direita para a esquerda;
adição dos termos da esquerda para a direita;
adição separada dos termos positivos e dos termos negativos da esquerda para a direita;
adição separada dos termos positivos e dos termos negativos da direita para a esquerda.
Compare e discuta os resultados obtidos no computador. 
#include <stdio.h>
#define TAMANHO 1000
int main() {
 float soma1, soma2, soma3, soma4;
 float negativos, positivos;
 int i, sinal;
 
 /* Soma da direita para a esquerda */
 soma1 = 0;
 sinal = -1;
 for (i = TAMANHO; i > 0; i--){
 soma1 = soma1 + (float) sinal/i;
 sinal = -sinal;
 }
 
 /* Soma da esquerda para a direita */
 soma2 = 0;
 sinal = 1;
 for (i = 1; i <= TAMANHO; i++){
 soma2 = soma2 + (float) sinal/i;
 sinal = -sinal;
 } 
Adi�o separada dos termos positivos e dos termos negativos da esquerda para a direita 
 negativos = 0;
 positivos = 0;
 
 for (i = 1; i <= TAMANHO; i++)
 if (i % 2 == 1)
 positivos += (float) 1/i;
 else
 negativos += (float) 1/i;
 soma3 = positivos - negativos;
 
Adi��o separada dos termos positivos e dos termos negativos da direita para a esquerda
 negativos = 0;
 positivos = 0;
 
 for (i = TAMANHO; i > 0; i--)
 if (i % 2 == 1)
 positivos += (float) 1/i;
 else
 negativos += (float) 1/i;
 soma4 = positivos - negativos;
 
 printf("Primeira soma = %.20g\n", soma1);
 printf("Segunda soma = %.20g\n", soma2);
 printf("Terceira soma = %.20g\n", soma3);
 printf("Quarta soma = %.20g\n", soma4);
 return 0;
}
Site da USP – REPETIÇÃO
2.  Dado um número inteiro positivo n, determinar todos os inteiros entre 1 e n que são comprimento da hipotenusa de um triângulo retângulo com catetos inteiros. 
#include <stdio.h>
#define VERDADEIRO 1
#define FALSO 0
int main() {
 int n, cateto1, cateto2, hipotenusa;
 int achou;
 printf("Digite o comprimento maximo da hipotenusa: ");
 scanf("%d" , &n);
 for (hipotenusa = 1; hipotenusa <= n; hipotenusa++) {
 achou = FALSO;
 /* testa todos os candidatos a cateto */
 for (cateto1 = 1; cateto1 < hipotenusa && !achou; cateto1++) {
 cateto2 = cateto1; /* cateto1 e' o menor cateto */
 while (cateto1*cateto1 + cateto2*cateto2 < hipotenusa*hipotenusa)
	cateto2++;
 if (cateto1*cateto1 + cateto2*cateto2 == hipotenusa*hipotenusa){
	printf("hipotenusa = %d, catetos %d e %d\n", hipotenusa, cateto1, cateto2);
	achou = VERDADEIRO;
 }
 }
 }
 return 0;
}
3.  Dados dois naturais m e n determinar, entre todos os pares de números naturais (x,y) tais que x < m e y < n, um par para o qual o valor da expressão xy - x2 + y seja máximo e calcular também esse máximo. 
SOLUCAO: simples e direta.
#include <stdio.h>
int main() {
 int n, m; /* determinam o intervalo da funcao */
 int x, y; /* usados para o calculo do maximo */
 int valor; /* guarda x*y - x*x + y */
 int xmax, ymax; /* argumentos que maximizam a funcao */
 int valormax; /* guarda xmax*ymax - xmax*xmax + ymax */
 printf("Maximizo x*y - x*x + y, onde 0 <= x <= n e 0 <= y <= m.\n");
 /* leia os limitantes do intervalo */
 printf("Entre com n e m: ");
 scanf ("%d %d", &n, &m);
 /* inicializacoes */
 xmax = ymax = 0;
 valormax = 0; /* valormax == xmax*ymax - xmax*xmax + ymax */
 /* testa tos os possiveis valores da funcao */
 for (x = 0; x <= n; x++) 
 {
 for (y = 0; y <= m; y++) 
	{
 valor = x*y - x*x + y;
 if (valor > valormax)
	 {
 valormax = valor;
 xmax = x;
 ymax = y;
	 }
	} 
 } 
 printf("Valor maximo da funcao = %d foi alcancado com x = %d e y = %d\n", 
 valormax, xmax, ymax);
 return 0;
} 
4.  Dados n números inteiros positivos, calcular a soma dos que são primos. 
#include <stdio.h> 
#include <conio.h> 
int main() { 
 int n, numero, i, divisores=0, j, soma=0; 
 printf("Digite o comprimentoda sequencia: "); 
 scanf("%d", &n); 
 printf("Digite um sequencia de %d numeros: ", n); 
 for (i=0; i<n; i++) { 
 scanf("%d", &numero); 
 divisores = 0; 
 for (j=1; j<=numero; j++) { 
 if (numero % j==0) { 
 divisores++; 
 } 
 } 
 if (divisores == 2) { 
 soma += numero; 
 } 
 } 
 printf("A soma dos primos eh %d\n", soma); 
 getch(); 
}
5.  Sabe-se que um número da forma n3 é igual a soma de n ímpares consecutivos.
Exemplo: 13= 1, 23= 3+5, 33= 7+9+11,  43= 13+15+17+19,... Dado m, determine os ímpares consecutivos cuja soma é igual a n3 para n assumindo valores de 1 a m. 
SOLUCAO 1
#include <stdio.h>
int main() {
 int n, m, i, inicio, soma;
 printf("Digite o valor de m: ");
 scanf("%d", &m);
 for (n = 1; n <= m; n++) {
 soma = 0;
 for (inicio = 1; soma != n * n * n; inicio = inicio + 2) {
 soma = 0;
 for (i = 0; i < n; i++)
	soma = soma + inicio + 2 * i;
 }
 inicio = inicio - 2;
 printf("%d*%d*%d = %d", n, n, n, inicio);
 for (i = 1; i < n; i++)
 printf("+%d", inicio+2*i);
 printf("\n"); 
 }
 return 0;
}
SOLUCAO 2
#include <stdio.h>
int main() {
 int m, /* dado de entrada */
 n, i, 
 inicio; /* primeiro dos impares de uma sequencia que soma n^3 */
 printf("Digite o valor de m: ");
 scanf("%d", &m);
 inicio = 1;
 for (n = 1; n <= m; n++) {
 printf("%d*%d*%d = %d", n, n, n, inicio);
 for (i = 1; i < n; i++)
 printf("+%d", inicio + 2 * i);
 inicio = inicio + 2 * n; /* inicio da proxima sequencia */
 printf("\n"); 
 }
 return 0;
}
6.  Dado um número inteiro positivo, determine a sua decomposição em fatores primos calculando também a multiplicidade de cada fator. 
#include <stdio.h>
int main(){
 int n; /* numero dado */
 int fator; /* candidato a fator do numero dado */
 int mult; /* multiplicidade de fator */
 printf("Decomponho um numero dado em fatores primos.\n");
 printf("Entre com o numero (> 1) a ser decomposto: ");
 scanf("%d", &n);
 printf("Decomposicao de %d em fatores primos:\n", n); 
 fator = 2;
 while (n > 1) {
 mult = 0;
 while (n % fator == 0) {
 mult ++;
 n = n / fator; 
 }
 if (mult != 0) {
 printf(" fator %d multiplicidade %d\n", fator, mult); 
 }
 fator++; 
 }
 return 0;
}
7.  Dados um inteiro positivo n e uma seqüência de n inteiros positivos, determinar o máximo divisor comum a todos eles. 
SOLUCAO 1: o programa usa a igualdade mdc(a,b,c) == mdc(mdc(a,b),c). Em cada iteracao o mdc de dois numeros, digamos num1 e num2, e' encontrado examinando-se os numero 1, 2, 3, ..., min(num1,num2) nessa ordem.
#include <stdio.h>
int main() {
 int n; /* no. de elementos na sequencia */
 int i; /* contador de numeros lidos */
 int mdc; /* maximo divisor comum dos numeros lidos */
 int numero; /* guarda um numero da sequencia */ 
 int novo_mdc; /* candidato a novo mdc */
 int divisor; /* usado para encontrar o novo mdc */
 printf("Determino mdc de n (>0) numeros positivos.\n");
 /* leia o tamanho da sequecia */
 printf("Entre com n: ");
 scanf ("%d", &n);
 /* leia o 1o. numero da sequencia */
 printf("Entre com o 1o. numero da sequencia: ");
 scanf ("%d", &mdc);
 
 i = 1;
 while (i < n) {
 printf("Entre com o %do. numero da sequencia: ", i+1);
 scanf ("%d", &numero);
 i = i + 1; /* mais um numero foi lido */
 /* calcule o max divisor comum de mdc e numero */ 
 divisor = 1;
 while (divisor <= mdc && divisor <= numero) {
 if (mdc % divisor == 0 && numero % divisor == 0) 
	 {
 novo_mdc = divisor; 
 }
 divisor = divisor + 1;
 }
 /* atualize o mdc dos numeros lidos */
 mdc = novo_mdc;
 }
 printf("MDC = %d\n", mdc);
 return 0;
} 
SOLUCAO 5: COM FOR o programa usa a igualdade mdc(a,b,c) == mdc(mdc(a,b),c). Em cada iteracao o mdc de dois numeros, digamos num1 e num2, e' encontrado examinando-se os numero num1, num1-1, num1-2,..., 2, 1, nessa ordem.
#include <stdio.h>
int main() {
 int n; /* no. de elementos na sequencia */
 int i; /* contador de numeros lidos */
 int mdc; /* maximo divisor comum dos numeros lidos */
 int numero; /* guarda um numero da sequencia */ 
 int divisor; /* usado para encontrar o novo mdc */
 printf("Determino mdc de n (>0) numeros positivos.\n");
 /* leia o tamanho da sequecia */
 printf("Entre com n: ");
 scanf ("%d", &n);
 /* leia o 1o. numero da sequencia */
 printf("Entre com o 1o. numero da sequencia: ");
 scanf ("%d", &mdc);
 
 for (i = 1; i < n; i++) 
 {
 printf("Entre com o %do. numero da sequencia: ", i+1);
 scanf ("%d", &numero);
 /* calcule o max divisor comum de mdc e numero */ 
 for (divisor = mdc; mdc % divisor != 0 || numero % divisor != 0; divisor--); 
		
 /* atualize o mdc dos numeros lidos */
 mdc = divisor;
 }
 printf("MDC = %d\n", mdc);
 return 0;
} 
SOLUCAO 7: Versao mais elaborada. Usa o algoritmo de Euclides para determinar o maximo divisor comum de dois numero.
#include <stdio.h>
int main() {
 int n; /* no. de elementos na sequencia */
 int i; /* contador de numeros lidos */
 int mdc; /* maximo divisor comum dos numeros lidos */
 int numero; /* guarda um numero da sequencia */ 
 int resto; /* usado para encontrar o novo mdc */
 printf("Determino mdc de n (>0) numeros positivos.\n");
 /* leia o tamanho da sequecia */
 printf("Entre com n: ");
 scanf ("%d", &n);
 /* leia o 1o. numero da sequencia */
 printf("Entre com o 1o. numero da sequencia: ");
 scanf ("%d", &mdc);
 
 for (i = 1; i < n; i++) {
 printf("Entre com o %do. numero da sequencia: ", i+1);
 scanf ("%d", &numero);
 /* algoritmo de Euclides para encontra o maxi divisor comum de 
 * mdc e numero 
 */ 
 while (numero != 0) 	{
	 resto = mdc % numero;
	 mdc = numero;
	 numero = resto;
	}
 /* neste ponto do progra mdc contem o maximo divisor comum dos 
 * numeros lido
 */
 }
 printf("MDC = %d\n", mdc);
 return 0;
} 
8.  (POLI 97) Dizemos que uma seqüência de inteiros positivos é k-alternante se for composta alternadamente por segmentos de números pares de tamanho k e segmentos de números ímpares de tamanho k.
Exemplos:
A seqüência   1 3 6 8 9 11 2 4 1 7 6 8 é 2-alternante.
A seqüência   2 1 4 7 8 9 12 é 1-alternante.
A seqüência   4 2 3 1 6 4 2 9 3 não é alternante.
A seqüência   1 3 5 é 3-alternante.
Dado n > 1 e uma seqüência com n inteiros, verificar se existe um inteiro k > 1 tal que a seqüência é k-alternante. Dê como saída também o valor de k caso a seqüência seja alternante. 
SOLUCAO 1: simples e direta. Note o cuidado especial com o ultimo segmento e ultimo elemento.
#include <stdio.h>
#define FALSE 0
#define TRUE 1
int main() {
 int n; /* no. de elementos na sequencia */
 int i; /* contador de numeros lidos */
 int numero; /* usado para ler a sequencia */
 int paridade; /* indica a paridade do segmento (0 = par, 1 = impar) */
 int k; /* candidado a grau da alternacia */
 int kaux; /* tamanho do segmento corrente */ 
 int k_alternante; /* indica se a sequencia e' ou nao k-alternate */
 printf("Determino se uma sequencia de n (>0) inteiros e k-alternante.\n");
 /* leia o tamanho da sequecia */
 printf("Entre com n: ");
 scanf ("%d", &n);
 /* determina candidato a k e paridade do primeiro 1o. segmento */
 printf("Entre com o 1o. numero da sequencia: ");
 scanf ("%d", &numero);
 paridade = numero % 2;k = 1;
 i = 1; 
 while (i < n && numero % 2 == paridade) {
 printf("Entre com o %do. numero da sequencia: ", i+1); 
 scanf ("%d", &numero);
 i = i + 1; /* mais um numero foi lido */
 if (numero % 2 == paridade) {
 k = k + 1;
	}
 }
 /* neste ponto vale que k e' o comprimento do 1o. segmento de 
 * mesma paridade.
 */
 printf("candidato a k = %d\n", k);
 /* a sequencia e' k-alternante ate que se prove o contrario */
 k_alternante = TRUE;
 while (i < n) {
 /* ajuste a alternancia da paridade */
 paridade = (paridade + 1) % 2; 
 kaux = 1;
 while (i < n && numero % 2 == paridade) 	{
	 printf("Entre com o %do. numero da sequencia: ", i+1); 
	 scanf ("%d", &numero);
	 i = i + 1; /* mais um numero foi lido */
	 if (numero % 2 == paridade) {
	 kaux = kaux + 1;
	 }
	}
 
 if (kaux != k) 	{
	 k_alternante = FALSE;
	}
 }
 
 /* o ultimo elemento merece um cuidado especial... */
 if (numero % 2 != paridade && k != 1) {
 k_alternante = FALSE;
 }
 
 if (k_alternante == TRUE) 
 printf("A sequencia e %d-alternante\n", k);
 else
 printf("A sequencia nao e' k-alternante\n");
 
 return 0;
} 
SOLUCAO 4: eta solucao bonita.
#include <stdio.h>
#define FALSE 0
#define TRUE 1
int main() {
 int n; /* no. de elementos na sequencia */
 int i; /* contador de numeros lidos */
 int numero; /* usado para ler a sequencia */
 int paridade; /* indica a paridade do segmento (0 = par, 1 = impar) */
 int k; /* candidado a grau da alternacia */
 int kaux; /* tamanho do segmento corrente */ 
 int k_alternante; /* indica se a sequencia e' ou nao k-alternate */
 printf("Determino se uma sequencia de n (>0) inteiros e k-alternante.\n");
 /* leia o tamanho da sequencia */
 printf("Entre com n: ");
 scanf ("%d", &n);
 /* leia o 1o. elemento e determine a sua paridade */
 printf("Entre com o 1o. numero da sequencia: ");
 scanf ("%d", &numero);
 paridade = numero % 2; 
 kaux = 1; /* comprimento corrente do segmento */ 
 /* a sequencia e' k-alternante ate que se prove o contrario */
 k_alternante = TRUE;
 k = 0; /* o valor de k ainda precisa ser determinado */
 for (i = 1; i <= n; i++) {
 /* caso 1: i == n */
 if (i == n) 	{
	 /* acabou de ler a sequencia */ 
 /* caso 1A: 1o. segmento */ 
	 if (k == 0) {
	 /* a sequencia e' composta por numeros de mesma paridade */
	 k = kaux;
	 }
 /* caso 1B: nao e' o 1o. segmento */
 else if (kaux != k) 	 {
	 k_alternante = FALSE;
	 }
	}
 /* caso 2: i != n */
 else 	{
	 printf("Entre com o %do. numero da sequencia: ", i+1); 
	 scanf ("%d", &numero);
 /* caso 2A: numero % 2 == paridade */	 
 	 if (numero % 2 == paridade) 	 {
	 kaux = kaux + 1;
	 }
 /* caso 2B: numero % 2 != paridade */	 
	 else	 {
 /* caso 2B1: 1o. segmento */
 if (k == 0)		{
		 k = kaux;
		}
 /* caso 2B2: nao e' o 1o. segmento */
 else if (kaux != k) 		{
		 k_alternante = FALSE;
		}
	 kaux = 1;
	 paridade = (paridade + 1) % 2;
	 } 
	}
 }
 
 if (k_alternante == TRUE) 
 printf("A sequencia e %d-alternante\n", k);
 else
 printf("A sequencia nao e' k-alternante\n");
 
 return 0;
}

Continue navegando