Departamento de Ciência da
Computação - IME - USP
#include <stdio.h> int main(){ int nusp, n, i, j, soma, cont; printf ("Entre com seu no. USP: "); scanf ("%d", &nusp); /* nesta linha use o seu numero USP */ printf ("nusp = %d\n", nusp); n = 3 + nusp%3; printf("0: n = %d\n", n); if (n < 3) n = n + 3; if (n%2 == 0) i = (2*n + 1)/2; else if (n%3 == 0) i = (3*n)/2; else i = (n + 4)/2; printf("1: i = %d\n", i); if (i > 5) i = i - 2; j = 2*i + n; printf("2: n = %d, i = %d, j = %d\n", n, i, j); cont = i; while (cont > 1 && j > 0) { soma = n; if (j > 8 || i%2 == 0) { soma = soma + i; j = j - 5; i = i + 1; printf("3: i = %d, j = %d, soma = %d\n", i, j, soma); } else { soma = soma + j; i = i - 1; j = j + 2; printf("4: i = %d, j = %d, soma = %d\n", i, j, soma); } cont = cont - 1; } /* O ultimo valor a ser impresso e' o da variavel cont */ printf("5: i = %d, j = %d, cont = %d\n", i, j, cont); return 0; }
A resposta depende do resto da divisão do seu número USP por 3. Teste com o seu
no. USP e compare a resposta.
(0) nusp%3 == 0. Veja os 2 exemplos abaixo.
Entre com seu no. USP: 1234560
nusp = 1234560
0: n = 3
1: i = 4
2: n = 3, i = 4, j = 11
3: i = 5, j = 6, soma = 7
4: i = 4, j = 8, soma = 9
3: i = 5, j = 3, soma = 7
5: i = 5, j = 3, cont = 1
Entre com seu no. USP: 0
nusp = 0
0: n = 3
1: i = 4
2: n = 3, i = 4, j = 11
3: i = 5, j = 6, soma = 7
4: i = 4, j = 8, soma = 9
3: i = 5, j = 3, soma = 7
5: i = 5, j = 3, cont = 1
(1) nusp%3 == 1. Veja os 2 exemplos abaixo.
Entre com seu no. USP: 1234561
nusp = 1234561
0: n = 4
1: i = 4
2: n = 4, i = 4, j = 12
3: i = 5, j = 7, soma = 8
4: i = 4, j = 9, soma = 11
3: i = 5, j = 4, soma = 8
5: i = 5, j = 4, cont = 1
Entre com seu no. USP: 1
nusp = 1
0: n = 4
1: i = 4
2: n = 4, i = 4, j = 12
3: i = 5, j = 7, soma = 8
4: i = 4, j = 9, soma = 11
3: i = 5, j = 4, soma = 8
5: i = 5, j = 4, cont = 1
(2) nusp%3 == 2. Veja os 2 exemplos abaixo.
Entre com seu no. USP: 1234562
nusp = 1234562
0: n = 5
1: i = 4
2: n = 5, i = 4, j = 13
3: i = 5, j = 8, soma = 9
4: i = 4, j = 10, soma = 13
3: i = 5, j = 5, soma = 9
5: i = 5, j = 5, cont = 1
Entre com seu no. USP: 2
nusp = 2
0: n = 5
1: i = 4
2: n = 5, i = 4, j = 13
3: i = 5, j = 8, soma = 9
4: i = 4, j = 10, soma = 13
3: i = 5, j = 5, soma = 9
5: i = 5, j = 5, cont = 1
C
que lê dois números inteiros
p
e q
, p > 0
e q >
0
,
e imprime se p
é um subnúmero de q
.
[Um número
onde,
para cada p = pn*10n +
pn-1*10n-1 + . . . +
p1*101 + p0
,
i
,
0 <= i < n
, vale que 0 < pi < 9
,
é subnúmero de um número
onde, para cada q = qm*10m+ qm-1*10m-1
+ . . . + q1*101 + q0
,
i
, 0 <= i <= m
,
vale que 0 <= qi <= 9
,
se existe um número inteiro j
, 0 <= j <= m-n
,
tal que qj+i = pi
para
i=0,1, . . . ,n
.]
Por exemplo:
p = 5
, q = 5
, então p
é subnúmero de q
;
p = 23
, q = 1453157238
, então
p
é subnúmero de q
;
p = 253
, q = 258347543
, então
p
não é
subnúmero de q
;
p = 50
, q = 5
, então p
não é subnúmero de q
;
p = 11
, q = 10101
, então p
não é subnúmero de q
.
Exemplos de 6 execuções do programa:
Digite p e q: 5 5 Digite p e q: 23 258347
5 e' subnumero de 5 23 nao e' subnumero de 258347
Digite p e q: 23 1453157238 Digite p e q: 50 5
23 e' subnumero de 1453157238 50 nao e' subnumero de 5
Digite p e q: 253 258347543 Digite p e q: 11 10101
253 nao e' subnumero de 258347543 11 nao e' subnumero de 10101
/* * Solucao 1: Solucao curta e simples. */ #include <stdio.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 p e q: "); scanf("%d %d", &p, &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 e' subnumero de %d\n", p, q); } else { printf("%d nao e' subnumero de %d\n", p, q); } return 0; } /* * Solucao 2: identica a solucao 1 sem chaves superfluas. */ #include <stdio.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 p e q: "); scanf("%d %d", &p, &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 e' subnumero de %d\n", p, q); else printf("%d nao e' subnumero de %d\n", p, q); return 0; } /* * Solucao 3: esta solucao tem dois while's enacaixado * */ #include <stdio.h> #define TRUE 1 #define FALSE 0 int main() { int p; /* valor dado */ int q; /* valor dado */ int p_seg; /* segmento (prefixo) de p */ int q_seg; /* segmento (prefixo) de q */ int q_seg2; /* segmento (prefixo) de q_seg */ int dig_p; /* digito menos significativo de p_seg */ int dig_q; /* digito menos significativo de q_seg2 */ int subnumero; /* indica se p e subnumero de q */ /* 0. leia os dados */ printf("Digite p e q: "); scanf("%d %d", &p, &q); /* 1. verifique se p e subnumero de q */ subnumero = FALSE; q_seg = q; while (q_seg >= p && subnumero == FALSE) { /* 1.1 verifique se p e subnumero (sulfixo) de q_seg */ subnumero = TRUE; p_seg = p; q_seg2 = q_seg; while (p_seg > 0 && subnumero == TRUE) { dig_p = p_seg%10; p_seg = p_seg/10; dig_q = q_seg2%10; q_seg2 = q_seg2/10; if (dig_p != dig_q) { subnumero = FALSE; } } /* 1.2 `remova' o digito menos significativo de q_seg */ q_seg = q_seg/10; } /* 2. escreva resposta */ if (subnumero == TRUE) printf("%d e subnumero de %d\n", p, q); else printf("%d nao e subnumero de %d\n", p, q); return 0; } /* * Solucao 4: colocaremos aqui qualquer solução que virmos e que * seja essencialmente diferente das anteriores. */
C
que lê um número inteiro
n
, n > 0
, e lê uma seqüência de n
números inteiros e imprime o maior comprimento de um
segmento crescente.
[Um segmento de uma seqüência
é qualquer subseqüência da forma
a1, a2, . . . ,
an-1,an
Um segmento
ai, ai+1, ai+2, . . . ,
ai+k-1, ai+k
.
é crescente se
ai, ai+1, ai+2, . . . ,
ai+k-1, ai+k
O comprimento
de um segmento é o número de elementos no segmento.]
ai < ai+1 < ai+2 < . . . <
ai+k-1 < ai+k
.
Exemplos:
n=4
e a seqüência
3
1 7 9
a resposta é 3;
n=11
e a seqüência
4 6
-1 3 13 21 27
0 2 5 98
a resposta é 5;
n=1
e a seqüência
45
a resposta é 1;
n=6
e a seqüência
20
20
19
11
4
-5
a resposta é 1;
/* * Solucao 1: Solucao curta e simples. * */ #include <stdio.h> int main() { int n; /* tamanho da sequencia */ int atual; /* usado para aleitura da sequencia */ int anterior; /* elemento da sequencia lido antes de atual */ int compmax; /* maior comprimento de um segmento crescente da subsequencia lida */ int comp; /* comprimento do segmento crescente sendo examinado */ int i; /* contador de numeros ja lidos */ /* 0. leia o tamanho da sequencia */ printf("Digite o numero de elemento da sequencia: "); scanf("%d", &n); /* 1. leia o 1o. numero da sequencia */ printf("Digite o 1o. numero: "); scanf("%d", &anterior); /* 2. leia e examine o 2o., 3o.,... numero da sequencia */ compmax = 1; comp = 1; i = 1; while (i < n) { /* 2.1 leia o proximo numero da sequencia */ printf("Digite o %do. numero: ", i+1); scanf("%d", &atual); i = i + 1; /* 2.2 atualize o comprimento da seq crescente corrente */ if (anterior < atual) { comp = comp + 1; if (comp > compmax) { compmax = comp; } } else { comp = 1; } anterior = atual; } printf("Maior comprimento de um segmento crescente = %d\n", compmax); return 0; } /* * Solucao 2: identica a solucao 1, com for no lugar de * while. */ #include <stdio.h> int main() { int n; /* tamanho da sequencia */ int atual; /* usado para aleitura da sequencia */ int anterior; /* elemento da sequencia lido antes de atual */ int compmax; /* maior comprimento de um segmento crescente da subsequencia lida */ int comp; /* comprimento do segmento crescente sendo examinado */ int i; /* contador de numeros ja lidos */ /* 0. leia o tamanho da sequencia */ printf("Digite o numero de elemento da sequencia: "); scanf("%d", &n); /* 1. leia o 1o. numero da sequencia */ printf("Digite o 1o. numero: "); scanf("%d", &anterior); /* 2. leia e examine o 2o., 3o.,... numero da sequencia */ compmax = 1; comp = 1; for (i = 1; i < n; i++) { /* 2.1 leia o proximo numero da sequencia */ printf("Digite o %do. numero: ", i+1); scanf("%d", &atual); /* 2.2 atualize o comprimento da seq crescente corrente */ if (anterior < atual) { comp = comp + 1; if (comp > compmax) { compmax = comp; } } else { comp = 1; } anterior = atual; } printf("Maior comprimento de um segmento crescente = %d\n", compmax); return 0; } /* * Solucao 3: identica a solucao 2 sem chaves superfluas. * */ #include <stdio.h> int main() { int n; /* tamanho da sequencia */ int atual; /* usado para aleitura da sequencia */ int anterior; /* elemento da sequencia lido antes de atual */ int compmax; /* maior comprimento de um segmento crescente da subsequencia lida */ int comp; /* comprimento do segmento crescente sendo examinado */ int i; /* contador de numeros ja lidos */ /* 0. leia o tamanho da sequencia */ printf("Digite o numero de elemento da sequencia: "); scanf("%d", &n); /* 1. leia o 1o. numero da sequencia */ printf("Digite o 1o. numero: "); scanf("%d", &anterior); /* 2. leia e examine o 2o., 3o.,... numero da sequencia */ compmax = 1; comp = 1; for (i = 1; i < n; i++) { /* 2.1 leia o proximo numero da sequencia */ printf("Digite o %do. numero: ", i+1); scanf("%d", &atual); /* 2.2 atualize o comprimento da seq crescente corrente */ if (anterior < atual) { comp = comp + 1; if (comp > compmax) compmax = comp; } else comp = 1; anterior = atual; } printf("Maior comprimento de um segmento crescente = %d\n", compmax); return 0; } /* * Solucao 4: identica a solucao 1; usa n como quantidade * de numeros a serem lidos */ #include <stdio.h> int main() { int n; /* quantida de numero da seq a serem lidos */ int atual; /* usado para aleitura da sequencia */ int anterior; /* elemento da sequencia lido antes de atual */ int compmax; /* maior comprimento de um segmento crescente da subsequencia lida */ int comp; /* comprimento do segmento crescente sendo examinado */ /* 0. leia o tamanho da sequencia */ printf("Digite o numero de elemento da sequencia: "); scanf("%d", &n); /* 1. leia o 1o. numero da sequencia */ printf("Digite o 1o. numero: "); scanf("%d", &anterior); n = n - 1; /* 2. leia e examine o 2o., 3o.,... numero da sequencia */ compmax = 1; comp = 1; while (n > 0) { /* 2.1 leia o proximo numero da sequencia */ printf("Digite o proximo numero: "); scanf("%d", &atual); n = n - 1; /* 2.2 atualize o comprimento da seq crescente corrente */ if (anterior < atual) { comp = comp + 1; if (comp > compmax) compmax = comp; } else comp = 1; anterior = atual; } printf("Maior comprimento de um segmento crescente = %d\n", compmax); return 0; } /* * Solucao 5: colocaremos aqui qualquer solução que virmos e que * seja essencialmente diferente das anteriores. */