Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

WisdownEye

Otimização Código que verifica um palindromo

Recommended Posts

Olá pessoal,

 

Esse é meu primeiro post com esse login, tendo em vista que perdi o meu anterior e a anos não frequentava aqui.

Estou estudando C utilizando o livro do Deitel, Como Programar em C, e em um determinado exercicio sobre palindromo, fiz um código que até onde testei está funcional, mas acredito que poderia ser melhorado, alguém sugere outra variação?

 

As limitações são:

 

Só pode usar: scanf, printf, while, if, else

 

Eu sei resolver com vetor invertendo ele e comparando em um for, mas com as limitações acima só consegui criar o código abaixo (detalhe meu foco é sempre performance e como usei muitas variáveis acredito que o código não está bom):

 

O exercicio é:

 

Um palidromo é um numero ou texto que é lido da mesma forma tanto da direita para a esquerda como da esquerda para a direita. Por exemplo, cada um dos inteiros seguintes de cinco digitos é palindromo: 12321, 55555, 45554 e 11611. Escreva um programa que leia um inteiro de cinco digitos e determine se ele é palindromo ou não. (Sugestão: Use operadores de divisão e resto, ou modulus, para separar o numero em seus algarismos isolados)

 

#include <stdio.h>

int main ()
	{
		int numero = 0, memoria = 0, inverso = 0, dezena_milhar = 0, milhar = 0, centena = 0, dezena = 0, unidade = 0;

		printf ("Entre com um numero de cinco digitos: ");
		scanf ("%d", &numero);

		memoria = numero;
		dezena_milhar = memoria / 10000;
		memoria -= dezena_milhar * 10000;
		milhar = memoria / 1000;
		memoria -= milhar * 1000;
		centena = memoria / 100;
		memoria -= centena * 100;
		dezena = memoria / 10;
		memoria -= dezena * 10;
		unidade = memoria;

		inverso = ((unidade * 10000) + (dezena * 1000) + (centena * 100) + (milhar * 10) + (dezena_milhar * 1));

		printf ("Dezena Milhar %d\n", dezena_milhar);
		printf ("Milhar %d\n", milhar);
		printf ("Centena %d\n", centena);
		printf ("Dezena %d\n", dezena);
		printf ("Unidade %d\n", unidade);

		printf ("Numero original: %d\nNumero invertido: %d\n", numero, inverso);

		printf ("%d\n", (inverso / 10000));
		printf ("%d\n", ((inverso - ((inverso / 10000) * 10000)) / 1000));

		if (unidade == (inverso / 10000) && milhar == ((inverso - ((inverso / 10000) * 10000)) / 1000))
			printf ("E um palindromo.\n");

		return 0;
	}

Desde já, agradeço a ajuda de todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sei resolver com vetor invertendo ele e comparando em um for, mas com as limitações acima só consegui criar o código abaixo (detalhe meu foco é sempre performance e como usei muitas variáveis acredito que o código não está bom):

 

E o que é um 'for' senão um 'while' compactado?

 

 

#include <stdio.h>
#include <string.h>

int main() {
char num[5];

scanf("%s", num);

int i = 0, j = 4;
int meio = 2;
while(i < meio && j > meio && num[i] == num[j]) {
i++;
j--;
}

printf("%s%sé palíndromo.\n", num, (i==meio)? " ": " não ");
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Eu sei resolver com vetor invertendo ele e comparando em um for, mas com as limitações acima só consegui criar o código abaixo (detalhe meu foco é sempre performance e como usei muitas variáveis acredito que o código não está bom):

E o que é um 'for' senão um 'while' compactado?

 

 

#include <stdio.h>
#include <string.h>

int main() {
 char num[5];

 scanf("%s", num);

 int i = 0, j = 4;
 int meio = 2;
 while(i < meio && j > meio && num[i] == num[j]) {
	i++;
	j--;
 }

 printf("%s%sé palíndromo.\n", num, (i==meio)? " ": " não ");
 return 0;
}

 

Opa,

 

Obrigado pela resposta Isis, mas assim como não podia usar vetor, pelo livro não poderia estar usando o array do char também, acho que deveria ter dito que as variveis disponiveis (para solução desse exercicio) são apenas: int, float (seguindo a ordem do livro sem atropelar o conteúdo didático).

Não resisti e dei uma fuçada na net, acabei conseguindo os arquivos de respostas para professores até o capitulo 5, vou usar apenas depois de resolver os exercicios.

Estou apanhando muito pra gerar códigos otimizados com essas limitações, você acha que o ideal seria eu deixar de lado o livro de C e ler algum livro de algoritmo? Ou até mesmo rever matematica para tentar diminuir essa dificuldade?

Para quem quiser ver a solução otimizada segue abaixo o código:

 

/* Exercise 3.35 Solution */
#include <stdio.h>

int main (void)
{
	int number;		/* input number */
	int temp;		/* temporary integer */
	int firstDigit;		/* first digit of input */
	int secondDigit;	/* second digit of input */
	int fourthDigit;	/* fourth digit of input */
	int fifthDigit;	/* fifth digit of input */

	printf ( "Enter a five-digit number: " ); /* get number */
	scanf ("%d", &number);

	temp = number;

	/* determine first digit by integer division by 10000 */
	firstDigit = temp / 10000;
	temp = number % 10000;

	/* determine second digit by integer division by 1000 */
	secondDigit = temp / 1000;
	temp = number % 100;

	/* determine fourth digit by integer division by 10 */
	fourthDigit = temp / 10;
	fifthDigit = number % 10;

	/* if first and fifth digits are equal */
	if ( firstDigit == fifthDigit ) {

		/* if second and fourth digits are equal */
		if ( secondDigit == fourthDigit ) {

			/* number is palindrome */
			printf ( "%d is a palindrome\n", number );
		}
		else { /* number is not a palindrome */
			printf ( "%d is not a palindrome\n", number );
		} /* end else */

	} /* end if */
	else { /* number is not a palindrome */
		printf ( "%d is not a palindrome\n", number );
	} /* end else */

	return 0; /* indicate sucefull termination */
} /* end main */

Compartilhar este post


Link para o post
Compartilhar em outros sites
Estou apanhando muito pra gerar códigos otimizados com essas limitações, você acha que o ideal seria eu deixar de lado o livro de C e ler algum livro de algoritmo? Ou até mesmo rever matematica para tentar diminuir essa dificuldade?

 

 

Matemática ajuda. Na verdade otimização de algoritmos pouco tem a ver com linguagem usada em si (antes de alguém escrever besteira no próximo post, leia o resto). Chamei um ex-colega da Siemens p/ dar uma palestra sobre otimização de código em Java (uma linguagem que todo mundo na faculdade achava ruim justificando que era lenta -- assim mesmo, sem comparação ou métrica nenhuma). No final da palestra,depois de ter apresentado algumas técnicas de programação e falado um pouco sobre as estruturas de dados da linguagem, o tempo de execução do programa caiu de 5 minutos p/ quase um instantâneo, trocando as estruturas utilizadas e aplicando as ditas técnicas.

 

O problema é que não ler um livro sobre C te deixa no escuro sobre como a linguagem é estruturada/funciona.

 

Eu estou sem compilador aqui na pós, mas veja se você consegue escrever o programa desse jeito:

 

 

1- É sabido que o número de dígitos necessários p/ representar um inteiro N na base b é ceil(logb N). Exemplo: 890 em binário precisa de 10 dígitos. 73482 na base 10 precisa de 5 dígitos. Esse último exemplo parece retardado, mas não existe modo do computador saber exatamente quantos dígitos devem ser considerados, já que tudo está limitado à arquitetura da máquina (32 bits, 64 bits).

 

2- Notação científica: 1387200000 = 1,3872 * 109 = 1.3872e9 = 1.3872 *pow(10,9). As divisões que você usa podem ser escritas dessa forma:

 

dezena_milhar = memoria * pow(10, -4);
memoria -= dezena_milhar * pow(10, -4);

 

 

3- O 'meio' do número pode ser determinado com floor(ceil(logb N)). No caso de 5 dígitos, floor(2.5) = 2. Isso contando de 0 a D, senão, você usa ceil().

 

Quando eu sair da pós eu tento fazer algo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.