Jump to content
thinkabout

[Resolvido] Capicua - Usando vectores / arrays

Recommended Posts

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
}

Edited by thinkabout

Share this post


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

Share this post


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

Share this post


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

Edited by thinkabout

Share this post


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

Share this post


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

Edited by thinkabout

Share this post


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

Share this post


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

Edited by thinkabout

Share this post


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

Edited by HappyHippyHippo

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

Share this post


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

Edited by thoga31
Tags code + GeSHi

Share this post


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

  • Vote 1

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

Share this post


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

Share this post


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

Edited by HappyHippyHippo

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

Share this post


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

Share this post


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

Share this post


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.