Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Eduardo18

Capicua

Mensagens Recomendadas

Eduardo18

Um número capicua é um número que pode ser lido tanto da esquerda para a direita, como da direita para a esquerda. O maior número capicua resultante do produto entre dois algarismos de dois dígitos é 9009 = 91 x 99. Desenvolva uma aplicação que encontre o maior número capicua resultante do produto entre dois algarismos de três dígitos.

Alguém me pode ajudar por favor? Estou a ter dificuldades a desenvolver o programa.😣

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Apresenta a tua ideia de código e algum código se já o tiveres. A partir daí a malta ajuda-te!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18

Tenho mal,e ja estou a ficar confuso, e nao consigo compilar por estar com erros....e depois lembrei-me que nao posso usar estruturas,so instruçoes dd decisao.

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	
	/*Declarar variáveis*/
	int i=0, a , b , c ,tam,tamaux,i,j,k,capicuas=0,cap;
	
	/*Recolher numero se é capicua*/
	printf("Insira o numero,para ver se é capicua:\n");
	scanf("%d", &=0);
	
	a =0;
	b =0;
	c =0;
	
	while(a!=0)
	{
		b=a%10;
		a=a/10;
		c=c*10+b;
	}
	for(i=0,j=tam-1;i<j;i++,j--)//pecorre o vetor pelos 2 lados comparando os numeros a mesma distancia do centro
		{
			
			if(num[i]!=num[j])
			{
				cap=0;//se os numeros a mesma distancia do centro são diferentes,o numero nao é capicua
			
			}

		}
		if(cap == 1)//se a variavel de controle indica um capicua
		{
			printf("\n%d\n",k);//imprime o capicua
			capicuas++;//incrementa o numero de capicuas
		}
		
	}
	
	
	printf("\nQuantidade de capicuas %d\n",capicuas);//imprime o numero de capicuas
	
	
	return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Vou-te pedir para usares as tags "code=c" e "/code" para facilitar a leitura do código.

Vou dar uma vista de olhos e entretanto quero que mostres aqui as mensagens de erro!

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Bom, eu também não sei como detectar se um número é capicua ou não e por isso fui pesquisar e encontrei isto:

#include <stdio.h>
int main()
{
    int n, reversedInteger = 0, remainder, originalInteger;

    printf("Enter an integer: ");
    scanf("%d", &n);

    originalInteger = n;

    // reversed integer is stored in variable 
    while( n!=0 )
    {
        remainder = n%10;
        reversedInteger = reversedInteger*10 + remainder;
        n /= 10;
    }

    // palindrome if orignalInteger and reversedInteger are equal
    if (originalInteger == reversedInteger)
        printf("%d is a palindrome.", originalInteger);
    else
        printf("%d is not a palindrome.", originalInteger);
    
    return 0;
}

Este é um dos algoritmos para detectar uma capicua!

Agora resta-te adaptar o code para limitar a 3 algarismos!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

O código que tens, tem vários erros a começar no scanf();. Repara onde e como estás a guardar o valor lido pelo scanf();.

Depois estás a usar um vector que nem sequer o declaraste!

Tentar ir pelo algoritmo que deixei no post anterior!

Edited;

E outra coisa. O que estás a tentar fazer no teu código não é o que é pedido no enunciado.

O que pede é para verificar se o produto dos 3 algarismos é uma capicua e ir comparando cada capicua e guardar a maior capicua!

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18

mas posso utlizar na mesmo o while para o capicua (instruçoes de decisao)?

*instruçoes de repetição

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n
11 minutes ago, Eduardo18 said:

mas posso utlizar na mesmo o while para o capicua (instruçoes de decisao)?

*instruçoes de repetição

Eu não percebi a pergunta.

Agora que tens o algoritmo para encontrar uma capicua, tens que:

fazer produtos de todas as combinações possíveis com 3 algarismos, verificar se são capicuas. Se forem capicuas, guardá-los e compará-los com as capicuas anteriores. Se forem, maiores, guardam-se, se não, mantém-se a capicua anterior.

Exemplo: 0 * 0 * 1 e verificar se o resultado deste produto é uma capicua e se for, guardar o número numa variável. 0 * 0 * 2 e verificar se o resultado é uma capicua e se for, comparar com o resultado anterior. Se for maior que o anterior, guardar este, senão, manter o anterior. E repetir este processo até ao valor 999.

No fim é apenas mostrar qual o maior número encontrado que corresponde a uma capicua.

 

Edited;

CORRECÇÂO

Em vez de começar os produtos no 0, devemos começar no 100, pois o enunciado fala em 3 algarismos.

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Mais uma correcção:

Eu próprio estou a perceber aos poucos o que é pedido.

O que se pretende é mais isto:

100 * 100

100 * 101

100 * 102

...

100 * 999

E todos estes produtos resultam num valor. É este valor que temos que verificar se é uma capicua. Se for, comparamos com a capicua anterior. Se for maior, guardamos a actual, senão mantemos a anterior.

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n
45 minutes ago, Eduardo18 said:

mas para esses valores do produto, temos que criar um novo for ou é dentro do while?

Eu já consegui fazer o código, penso eu.

Eu fiz duas funções. Uma que verifica se o produto é capicua e outra função que verifica qual a maior capicua.

Tens que usar um loop ou mais que te garanta que fazes os produtos todos com valores de 3 dígitos:

100 * 100

100 * 101

...

100 * 999

...

101 * 101

101 * 102

101 * 103

...

102 * 102

102 * 103

....

999 * 999

 

Eu fiz isto com 2 loops for encadeados.

Depois usei a função verificaCapicua() para saber se cada produto era uma capicua ou não.

Depois, se o produto é uma capicua, usei a outra função maiorCapicua() para verificar se a capicua actual é maior ou não que a anterior e guardá-la, caso seja maior.

No fim imprimi apenas a maior capicua! A mim deu-me 906609.

Nota: Usei um ponteiro. Não sei se já sabes usá-los e se podes usá-los!

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Bom, estive a verificar e o meu código tem um bug que não influencia o resultado. Os loops que eu usei para fazer os produtos, estão a fazê-los em duplicado. No entanto, a maior capicua é sempre a maior, quer o resultado aparece apenas uma vez ou apareça mais que uma vez.

Vou dormir e amanhã posso tentar corrigir isto.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	
	//Declarar variáveis
    int n, inteiroReverso = 0, restante, inteiroOriginal, maiorCapicua, i , j=0;
    
    //Recolher  o numero digitado
    printf("Digite um inteiro: ");
    scanf("%d", &n);

    inteiroOriginal = n;

    //inteiro invertido é armazenado na variável
    while( n!=0 )
    {
        restante = n%10; //captura cada digito
        inteiroReverso = inteiroReverso*10 + restante;//Adiciona sempre um digito na variável inteitoReverso, e que é multiplicado por 10.
        n /= 10; //controla o loop
    }
    for( i=0;i<100;i++)
	{
		100 * 100;
		100 * 101;
		
		101 * 101;
		101 * 102;
		101 * 103;
		
		102 * 102;
		102 * 103;
		
		999 * 999;
		
	}
	for( j=0;j<100;j++)
	{
		100 * 100;
		100 * 101;
		
		101 * 101;
		101 * 102;
		101 * 103; 
		
		102 * 102;
		102 * 103;
		
		999 * 999;
	}

    // capicua se o inteiro original e o reverso forem iguais
    if (inteiroOriginal == inteiroReverso)
	{
        printf("%d e capicua.\n", inteiroOriginal);//se é capicua
    }else
	{
		printf("%d nao e capicua.\n", inteiroOriginal);//se não é capicua   
    }
	
	
	
	printf("maior numero capicua e: %d", maiorCapicua);//apresentar maior numero capicua
	return 0;
}

 

Editado por Eduardo18
porque chegou ao limite maximo de publicações

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n
6 hours ago, Eduardo18 said:

eu vou entretanto tambem dormir,mas queria ver se conseguia colocar a funcionar,porque este exercicio está me pôr confuso.

Faz por partes. 

Primeiro: escrever código que faz a tal multiplicação de todos os números de 3 dígitos. Algo como:

for(int i=0.......)
  for(int j =0........)
 	
  produto = //multiplicação aqui usando o 100 e o i é o j dos loops for

Não posso dizer muito mais senão faço tudo. É isto leva ao pequeno problema que falei. Vai acontecer que o loop exterior vai acabar por repetir valores do loop interior. Mas como para já não tenho outra solução, esta deve servir para tentares resolver o problema.

Depois mais logo ou durante o dia, certamente alguém te encaminhará para uma solução mais optimizada e robusta. 

  • Voto 1

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n
8 minutes ago, Eduardo18 said:

já consegui resolver,tambem  já dá para compilar....

Apresenta o teu código para compararmos.

Qual a maior capicua que obtens?


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18
3 minutos atrás, PsySc0rpi0n disse:

Apresenta o teu código para compararmos.

Qual a maior capicua que obtens?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	
	//Declarar variáveis
    int i , j , produto, cap =0, cap_Produto, max;
    
    printf("Insira o numero:\n");
    
    for ( i = 100; i <= 999; i++){
    	for ( j = 100; j <= 999; j++){
    		produto = i * j;
    		cap_Produto = produto;
    		cap = 0;
    		
    		while (cap_Produto > 0){
    			cap = cap * 10 + cap_Produto %10;
    			cap_Produto /= 10;
			}
			// capicua se o inteiro original e o reverso forem iguais
			if (cap == produto){
				if( produto > max){
					max = produto;
				}
			} 
		}
		
	}
	printf("maior numero capicua e: %d\n", max);//apresentar maior numero capicua
	return 0;
}

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

@Eduardo18 já executaste o teu código? Qual a maior capicua que obtiveste?

(Apaguei parte do post porque talvez não se coloquem os casos que expus).

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18
8 minutos atrás, PsySc0rpi0n disse:

@Eduardo18 já executaste o teu código? Assim de repente, acho que, para além de irem faltar produtos, irão também existir produtos de números com menos de 3 dígitos.

Exemplo:

Qual é o primeiro produto efectuado pelos teus loops for? Os números usados nesse produto têm ambos os 3 dígitos pedidos pelo enunciado?

sim ja compilei.

bem,aquilo que ontem estavas me explicar penso estar errado,porque nao devemos dizer se é capicua ou nao capicua,no enunciado diz que temos que diz qual o maior numero capicua.....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n
1 minute ago, Eduardo18 said:

sim ja compilei.

bem,aquilo que ontem estavas me explicar penso estar errado,porque nao devemos dizer se é capicua ou nao capicua,no enunciado diz que temos que diz qual o maior numero capicua.....

Entretanto editei o meu post.

Quando dizes "o que ontem eu te estava a explicar", referes-te a quê?

O código que eu tenho, guarda apenas a maior capicua. Isto é se o código que eu tenho estiver correcto.

Diz-me qual a maior capicua que obtens para ver se coincide com a minha!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Bom, acho que já posso colocar a minha sugestão. Penso que o teu código deve dar o mesmo resultado que o meu!

#include <stdio.h>

int verificaCapicua(int n);
void maiorCapicua(int *pmCapicua, int pj, int pi);

int main(void){
   int mCapicua = 0;
  
   for(int i = 100; i < 999; i++){
      for(int j = 100; j < 999; j++){
         if( !verificaCapicua( j * i ) )
            maiorCapicua(&mCapicua, j, i);
      }
   }
   printf("A maior capicua do produto de dois números de 3 dígitos é %d!\n", mCapicua);
   return 0;
}
//------------------------------------------------
int verificaCapicua(int n){
   int reversedInteger = 0, remainder, originalInteger = 0;

   originalInteger = n;
   while(n != 0){
      remainder = n % 10;
      reversedInteger = reversedInteger * 10 + remainder;
      n /= 10;
   }
   if (originalInteger == reversedInteger){
      return 0;
   }
   return 1;
}
//------------------------------------------------
void maiorCapicua(int *pmCapicua, int pj, int pi){
   if( (pj * pi) > *pmCapicua){
      *pmCapicua = pj * pi;
   }
}

 


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18
8 minutos atrás, PsySc0rpi0n disse:

Entretanto editei o meu post.

Quando dizes "o que ontem eu te estava a explicar", referes-te a quê?

O código que eu tenho, guarda apenas a maior capicua. Isto é se o código que eu tenho estiver correcto.

Diz-me qual a maior capicua que obtens para ver se coincide com a minha!

O maior capicua tem que dar 906609.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Eduardo18
2 minutos atrás, PsySc0rpi0n disse:

Bom, acho que já posso colocar a minha sugestão. Penso que o teu código deve dar o mesmo resultado que o meu!


#include <stdio.h>

int verificaCapicua(int n);
void maiorCapicua(int *pmCapicua, int pj, int pi);

int main(void){
   int mCapicua = 0;
  
   for(int i = 100; i < 999; i++){
      for(int j = 100; j < 999; j++){
         if( !verificaCapicua( j * i ) )
            maiorCapicua(&mCapicua, j, i);
      }
   }
   printf("A maior capicua do produto de dois números de 3 dígitos é %d!\n", mCapicua);
   return 0;
}
//------------------------------------------------
int verificaCapicua(int n){
   int reversedInteger = 0, remainder, originalInteger = 0;

   originalInteger = n;
   while(n != 0){
      remainder = n % 10;
      reversedInteger = reversedInteger * 10 + remainder;
      n /= 10;
   }
   if (originalInteger == reversedInteger){
      return 0;
   }
   return 1;
}
//------------------------------------------------
void maiorCapicua(int *pmCapicua, int pj, int pi){
   if( (pj * pi) > *pmCapicua){
      *pmCapicua = pj * pi;
   }
}

 

o problema é que tu colocas cenas antes do int main,e naão se pode por ser  uma instruçao de repeticao.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n
2 minutes ago, Eduardo18 said:

O maior capicua tem que dar 906609.

Se o teu código dá isso, então tens o problema resolvido! Essa solução tinha-a deixado uns posts a cima! É só confirmar se o teu código dá o mesmo quando o executares!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.