Ir para o conteúdo
thinkabout

[Resolvido] Capicua - Usando vectores / arrays

Mensagens Recomendadas

thinkabout

Desenvolva um programa que verifique se um determinado número inteiro positivo é

capicua. O número a verificar é especificado pelo utilizador. Nota:um número é capicua

se for “simétrico”, como por exemplo os números 123321 e 694496.

Como o utilizador mete o número todo de uma vez o meu primeiro problema foi separar o mesmo e meter cada número numa posição no vector.

Agora vou tentar comparar as posições tipo a[1] com a[4], a[2], com [5], se todas forem iguais o número é capicua.

Para já ainda só pensei na situação que a capicua tem um número par de dígitos. (2,4,6,8).

Se alguém tiver ideias para uma abordagem mais simples agradeço ideias.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
main() {int numero;
int size=0,b=0,i,reduz,conta;
int a[100];
printf("Qual e o numero ?");
scanf("%d" , &numero);conta=numero;
// conta os Digitos
while (conta > 0)
{
conta /= 10;
size++;
}
// printf("\nO digito tem %d numeros \n", size); // Just checking a ver se corria bem
// Separa os digitos , e injecta os mesmo no array
while (numero > 0)
{
reduz = numero % 10;
a[(size-1)-b] = reduz;
// printf("\n %d" , reduz); // Just checking a ver se corria bem
numero /= 10;
b++;
}
for ( i = 0; i < size; i++)
{
printf("%d \n", a[i] ); // Just checking a ver se corria bem
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

É obrigatório usar arrays? É possível verificar uma capicua matematicamente...


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

O scanf le caracteres do teclado, converte para numero e mete o valor na variavel especificada.

Depois tu pegas no valor e transformas em caracteres para meteres num array.

Nao te parece que estas a fazer trabalho extra desnecessario? ???

Podes introduzir directamente do teclado num array ... e depois verificar se é capicua; sem necessidade da conversao string->numero interna no scanf e numero->string no teu codigo :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Ainda não

É obrigatório usar arrays? É possível verificar uma capicua matematicamente...

Não posso usar strings , só mesmo vectores.

Yep , eu já vi essa maneira de ires "empurrando" os números para a frente com a multiplicação por 10 e depois somares outro digito, mas não pode ser assim.

O scanf le caracteres do teclado, converte para numero e mete o valor na variavel especificada.

Depois tu pegas no valor e transformas em caracteres para meteres num array.

Nao te parece que estas a fazer trabalho extra desnecessario? ???

Podes introduzir directamente do teclado num array ... e depois verificar se é capicua; sem necessidade da conversao string->numero interna no scanf e numero->string no teu codigo :)

Não sei se te entendi, tipo eu posso introduzir número a número e ele vai guardando no vector, a questão é que tinha que saber quantos números o utilizador ia inserir e o utilizador tinha que por número a número.

Como ainda não posso usar strings, tive que arranjar uma solução

Com o código que fiz o utilizador pode inserir neste caso um número até 100 dígitos.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Com o código que fiz o utilizador pode inserir neste caso um número até 100 dígitos.

Nem por isso. O scanf() nao "ultrapassa" os limites do tipo int (provavelmente -2,147,483,648 a 2,147,483,647).

Usando o getchar() podes obter numeros ate ao tamanho do array (menos 1 para o '\0').


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Falei em 100 ,porque foi o tamanho do vector , posso mudar o tamanho para INT_MAX, mas para testar chega e sobra os 100.

Ainda não vi getchar().

As strings são o próximo capitulo.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

http://stackoverflow.com/questions/199184/how-do-i-check-if-a-number-is-a-palindrome

Talvez este link te ajude. O código está em C++, mas está aí o princípio sem recurso a Strings nem a esses ciclos todos. ;)

Isto é inverter o número

https://www.portugal-a-programar.pt/topic/52613-numero-capicua/page__hl__capicua

Penso que o tópico aqui no forum teve a mesma abordagem.

A questão é que tenho que usar vectores

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Arranjei um segundo vector o C, e inseri o número ao contrário do vector A, depois comparei se forem iguais é capicua.

Assim já não tenho o problema dos casos pares / ímpares / 0-9.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
main()
{
int numero;
int size=0,b=0,i,reduz,conta,tamanho=0;
int a[100],c[100];
printf("Qual e o numero ?");
scanf("%d" , &numero);
conta=numero;
// conta os Digitos
while (conta > 0)
{
conta /= 10;
size++;
}
// printf("\nO digito tem %d numeros \n", size); // Just checking a ver se corria bem

// Separa os digitos , e injecta os mesmo no array
while (numero > 0)
{
reduz = numero % 10;
a[(size-1)-b] = reduz;
c[b] = reduz;
// printf("\n %d" , reduz); // Just checking a ver se corria bem
numero /= 10;
b++;
}
for ( i = 0; i < size; i++)
{
printf("%d ", a[i] ); // Just checking a ver se corria bem
}
puts("\n");
for ( i = 0; i < size; i++)
{
printf("%d ", c[i] ); // Just checking a ver se corria bem
}

for ( i = 0; i < size; i++)
{
if (a[i] == c[i])
{
tamanho++;
}

}
if (tamanho == size)
{
printf("O numero e capicua\n");
}
else
printf("o numero nao e capicua\n");
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

tanta complicação

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

#define SIZE 100

int main()
{
 char numero[size];
 int i = 0, length = 0;

 printf("Qual o numero ?\n");
 scanf("%s", numero);

 length = strlen(numero);

 for (i = 0; i < length / 2; i++)
 {
   if (numero[i] != numero[length - i - 1])
   {
     printf("O numero %s nao e capicua\n", numero);
     return 0;
   }
 }
 printf("O numero %s e capicua\n", numero);

 return 0;
}

mesmo que não gostes/possas usar strings, verás que a diferença é pouca:

#include <stdio.h>

#define SIZE 100

int main()
{
 char numero[size];
 int readed = 0, aux = 0, i = 0, length = 0;

 printf("Qual o numero ?\n");
 scanf("%d", &readed);

 aux = readed;
 while (aux != 0)
 {
   numero[length] = aux % 10;
   length++;
   aux /= 10;
 }

 for (i = 0; i < length / 2; i++)
 {
   if (numero[i] != numero[length - i - 1])
   {
     printf("O numero %d nao e capicua\n", readed);
     return 0;
   }
 }
 printf("O numero %d e capicua\n", readed);

 return 0;
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cerejas

Boas, estava a tentar fazer um programa que introduzido um numero, verifique se é capicua ou nao atraves da comparaçao de dois vectores, mas algo está mal na comparaçao dos elementos intermedios do vector. Por exemplo se eu inserir o numero 123421, ou 12344444421 ele diz que é capicua. Alguem me pode dar alguma dica?

#include <stdio.h>

int main(){
int numero=123421, num, size=0, alg, i=0, j, k, devolve;
int v1[100];
int v2[100];

printf("Introduza o numero: ");
scanf("%d", &numero);
num=numero;
/*descobrir o nr de algarismos do nr*/
do{ 
num=num/10;
size=size+1;
}
while(num>0);

/*colocar cada algarismo no vector*/
do{ 
alg=numero%10;
v1[(size-1)-i]=alg;
v2[i]=alg;
i++;
numero=numero/10;
}
while(numero>0);
/*comparar vectores*/
for(j=0, k=0; j<size, k<size; j++, k++){
if(v1[j]==v2[k]){
devolve=1;
}
else {
devolve=0;
}
}

if(devolve==1){
printf("O numero indroduzido e' capicua.\n"); }
else {
printf("O numero nao e' capicua.\n");
}
}

Editado por thoga31
Tags code + GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

pelo código que vejo, a única coisa que o código tem em conta é o último dígito

ps : não vou especificar a má implementação da resolução, mas ficas a saber que muito do código que tens é completamente desnecessário

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cerejas

pelo código que vejo, a única coisa que o código tem em conta é o último dígito

ps : não vou especificar a má implementação da resolução, mas ficas a saber que muito do código que tens é completamente desnecessário

Tens razao, basta ter o ultimo digito igual e ele diz que é capicua. Mas porquê? É na parte da comparaçao dos vectores? Nao consigo perceber onde está o erro

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

só existe uma maneira de perceber : folha de papel e lápis

pega numa folha de papel e um lápis e escreve as variáveis e os seus valores durante todo o processo de comparação

for(j=0, k=0; j<size, k<size; j++, k++){
 if(v1[j]==v2[k]){
   devolve=1;
 } else {
   devolve=0;
 }
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cerejas

só existe uma maneira de perceber : folha de papel e lápis

pega numa folha de papel e um lápis e escreve as variáveis e os seus valores durante todo o processo de comparação

for(j=0, k=0; j<size, k<size; j++, k++){
 if(v1[j]==v2[k]){
devolve=1;
 } else {
devolve=0;
 }
}

Acho que o problema é que depois do else ele continua com o ciclo, por isso é que mesmo que haja valores diferentes no meio do vector, apenas o ultimo digito é que vai ditar se o valor do devolve vai ser 1 ou 0

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cerejas

Resolvi o problema adicionando um contador, sendo que no final se o contador for igual ao size é capicua, caso contrario nao é. Serve mas parece me uma maneira um bocado noob para fazer isto. Como é que poderia fazer com que ele saltasse fora do ciclo for assim que a condiçao dentro do if falhasse?

Partilhar esta mensagem


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

int main(){
 int v[100], i, size;

 printf("Introduza o numero: ");
 if (scanf("%s", v) != 1) {
   printf("Erro na leitura do numero\n");
   return -1;
 }

 size = strlen(v);
 for (i = 0; i < size / 2; i++) {
   if (v[i] < '0' || v[i] > '9' || v[size - i - 1] < '0' || v[size - i - 1] > '9') {
     printf("O valor inserido nao e um numero\n");
     return -1;
   }

   if (v[i] != v[size - i - 1]) {
     printf("O numero nao e uma capicua\n");
     return 0;
   }
 }

 if (v[i] < '0' || v[i] > '9') {
   printf("O valor inserido nao e um numero\n");
   return -1;
 }

 printf("O valor inserido e uma capicua\n");
 return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

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.