Jump to content
Eduardo18

Capicua

Recommended Posts

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.😣

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
Eduardo18

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

*instruçoes de repetição

Share this post


Link to post
Share on other 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.

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other 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.

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
Eduardo18

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

Share this post


Link to post
Share on other 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!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;
}

 

Edited by Eduardo18
porque chegou ao limite maximo de publicações

Share this post


Link to post
Share on other 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. 

  • Vote 1

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
Eduardo18
1 hora atrás, PsySc0rpi0n disse:

@Eduardo18 já há mais algum desenvolvimento?

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;
}

 

Share this post


Link to post
Share on other 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).

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other 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.....

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.