• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Flavio Amorim

[C] Palíndromo

5 mensagens neste tópico

Verifica se uma dada frase é um palíndromo (palavra, número ou frase, cuja leitura é a mesma quer se faça da esquerda para a direita, quer da direita para a esquerda). Atente nos seguintes exemplo para teste:

O galo nada no lago

Só com o tio somávamos oito moços!

Luza Rocelina, a namorada do Manuel, leu na "MODA DA ROMANA": "Anil é cor azul".

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

int palindromero(char f[]);

int main(){

 int i;
 char f[100];
 puts("Introduza uma string\n");
 gets(f);
 i=palindromero(f);
 if(i==1)
          puts("palindromero\n");
 else
      puts("nao palindromero\n");
 system("pause");
 return (1);
} //fim do main

int palindromero(char frase[]){
 int inic=0, fim=strlen(frase)-1;
 while(inic<fim){
if(frase[inic]==' '){
	inic++;
	continue;
	}
if(frase[fim]==' '){
	fim--;
	continue;
	}
if(frase[inic]!= frase[fim])
	return 0;
else
    inic++;
    fim--;
    }
  return(1);
}

ps:compilado usando gcc

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Palindromos sem strings!

Tens a opção de vectores e sm eles:

#include <stdio.h>

int main(){
unsigned int i, v, d1, d2, d3, d4, d5;

for(i=1; i<100000;i++){
	if(i<10)
		printf("%4d\t", i);
	else
		if (i<100){
			v=i;
			d1=v%10;
			v/=10;
			d2=v%10;
			if(d1==d2)
				printf("%4d\t", i);
		}
		else if (i<1000){

				v=i;
				d1=v%10;
				v/=10;
				v/=10;
				d2=v%10;
				d3=v%10;

				if(d1==d3)
					printf("%4d\t", i);
		}
		else if (i<10000){
			v=i;
			d1=v%10;
			v/=10;
			d2=v%10;
			v/=10;
			d3=v%10;
			v/=10;				
			d4=v%10;
			if(d1==d4){
				if(d2==d3)
				printf("%4d\t", i);
			}

		}
		else if(i<100000){
			v=i;
			d1=v%10;
			v/=10;
			d2=v%10;
			v/=10;
			d3=v%10;
			v/=10;				
			d4=v%10;
			v/=10;
			d5=v%10;
			if((d1==d5)&&(d2==d4))
				printf("%4d\t",i);
		}


}


}

Com vector:

#include<stdio.h>

void main(){
unsigned int v[9], i, j, n;

for(i=1;i<100000;i++){

	n=i;
	j=0;
	do{
		v[j++]=n%10;
		n/=10;

	}while(n>0);

	switch(j){

	case 1: printf("%d\t",i); break;
	case 2: 
		if(v[0]==v[1])
			printf("%d\t",i); break;
	case 3:
		if(v[0]==v[2])
			printf("%d\t",i); break;
	case 4:
		if(v[0]==v[3] && v[1]==v[2])
			printf("%d\t",i); break;
	case 5: 
		if(v[0]==v[4] && v[1]==v[3])
			printf("%d\t",i); break;
	case 6:
		if(v[0]==v[5] && v[1]==v[4] && v[2]==v[3])
			printf("%d\t",i); break;
	}

}
}

versao optimizada:

#include<stdio.h>

void main(){
int v[9], i, j, n ,k;
bool cap;

for(i=1;i<1000000;i++){
	n=i;
	j=0;

	do{
		v[j++]=n%10;
		n/=10;
	}while(n>0);

	cap=true;
	k=0;
	do{
		if (v[j-1-k]!=v[k++])
			cap=false;
	}while (j/2>=k&∩);
	if (cap)
		printf("%6d\t",i);
}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

algoritmo para determinar numero de palindromos q se podem formar retirando letras de uma string de input. resultado separado pelo numero de palindromos com diferentes tamanhos.

#include<stdio.h>
#include<string.h>
#define MAX_GENERICO 300

int main(void)
{
        // string de teste
char frase[MAX_GENERICO] = ">Oprecomediodagasolinavendidanoseuaatitrodola";
int palin[MAX_GENERICO];  
int auxI[MAX_GENERICO]; 
int auxJ[MAX_GENERICO] ; 
int i, j, k, x, max, teste; 

max = strlen(frase); 
teste = max +3;
for ( x = 0; x < teste ; x ++)
{
	palin[x] = 0;
	auxI[x] = 0;
	auxJ[x] = 0;
}

k = 1;      i = 1;
auxJ[0] = max;

while(1)
{
inicio: 	for (  ;  i < max - 1;   i++)
	{
		j = auxJ [ k - 1 ] - 1;
		auxI[k] = i;

		for (  ; j > i;  j--)
			if ( frase[i] == frase[j] )
			{
				auxJ[k] = j;
				palin[k*2]++;
				palin[k*2 + 1] += j - i -1;		/*contar os impares. letras no meio */
				k++;
				break;
			}
	}

	if ( --k == 0) break; 

	i = auxI[k];
	x = auxJ[k] -1;

	for (   ; x > i ;  x--)
		if ( frase[x] == frase[i] )
		{
			auxJ[k] = x;
			palin[k *2]++;
			palin[k*2 + 1] += x - i -1;	/*contar os impares. letras no meio */
			k++;
			i++;
			goto inicio;
		}


	if ( auxI[k+1] == auxI[k]+1 &&   k != 1)
	{
		k--;
		while (k>0)  
		{
			i = auxI[k];
			x = auxJ[k] -1;

			for (    ;   x > i  ;   x--)
				if ( frase[x] == frase[i] )
				{	
					auxJ[k] = x;
					palin[k *2]++;
					palin[k*2 + 1] += x - i -1;	/*contar os impares. letras no meio */
					i++;
					k++;
					goto inicio;
				}

			if ( auxI[k+1] == auxI[k]+1)  k--;
			else 
				break; 
		}
	}

	if ( k == 0) 
		break;
	i = auxI[k] +1;
}

printf("%d\n", max-1);
for ( i = 0; i <= max; i++)
printf("%d ", palin[i]);

return 0; 
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é...não uso espaços...e acho que o pessoal tb s devia habituar a isso....é uma seca cada vez k kero compilar algumas funções que aqui sao colocadas...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora