Jump to content

Recommended Posts

Posted

Boas pessoal, estou a realiza um trabalho de inicialização aos apontadores e assim, e tenho de criar uma função que me inverte um numero e depois outra que some o numero com este mesmo invertido (isto tudo com apontadores), pronto, e eu já fiz isso e esta funcional. Agora, o programa deve realizar sempre a soma e a inversão até o resultado da soma ser um numero capicua (ex 9339)... Eu sei como o fazer, mas acho uma solução um pouco complexa, pois necessito de dividir o numero e guardar num vector, etc etc.. Pergunto se não haverá uma solução engenhosa mais simples, ou mesmo uma função que me indique se o numero é capicua..? 

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

Uma funcao predefinida, tanto no Standard, como em POSIX, nao ha. Suponho que a biblioteca do Windows tambem nao tem nenhuma funcao predefinida que verifique se um numero (em forma de string) e capicua.

Qualquer solucao (meio) engenhosa passa por teres o numero em string ou algo parecido. Ja tens o numero em apontadores: talvez de para usar essa forma. Mete aqui a estrutura que estas a usar.

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!

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

void inverte (int *numero, int *numeroInvertido){
int inverso[99999999],x=0;
while(*numero/10!=0){
	inverso[x]=*numero%10;
	*numero=*numero/10;
	x++;
}
*numeroInvertido=0;
for(int i=0;i<x;i++){
	*numeroInvertido=*numeroInvertido+inverso[i]*(10*i);
}
}

void soma(int *numero, int *numeroInvertido, int *contagem){
*numero=*numero+*numeroInvertido;
contagem++;
}

void main(){
int num,inv,conta=0;
bool r;
printf("Introduz o numero:\n");
scanf("%d",&num);
printf("Numero: %d\n",num);
do{
	inverte(&num,&inv);
	soma(&num,&inv,&conta);

}while();
printf("Numero de somas: %d\n",conta);
system("pause");
}

Aquele do while do main é que é suposto conter a solução engenhosa xD

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

eu também concordo que converter para string é a forma de fazer isto já que não é uma propriedade matemática que está querendo e sim como o número é representado. Uma forma que imagino de fazer isto é a seguinte:

1)converter para string

2) dividir a string em duas, se o número de elementos for impar, retirar o elemento do meio das substrings

3) ir comparando uma string com o inverso da outra. Se forem iguais em todos os elementos, você tem uma capicua.

Fernando Lage Bastos - MCP/MCTS/MCPD

Posted

void inverte (int *numero, int *numeroInvertido){
int inverso[99999999],x=0;

Xiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ... nao achas que "int inverso[20]" chegava?

Repara que 2^64 usa 20 digitos (e o teu int nao tem 64 bits!).

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!

Posted

Xiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ... nao achas que "int inverso[20]" chegava?

Repara que 2^64 usa 20 digitos (e o teu int nao tem 64 bits!).

ahahahahahah, sim tens razão 😄 , a minha prof é que pos que o limite das somas não ultrapassava 4294967295, e eu sem pensar pus logo esse valor kkkk 😄 , mas tens toda a razão .

eu também concordo que converter para string é a forma de fazer isto já que não é uma propriedade matemática que está querendo e sim como o número é representado. Uma forma que imagino de fazer isto é a seguinte:

1)converter para string

2) dividir a string em duas, se o número de elementos for impar, retirar o elemento do meio das substrings

3) ir comparando uma string com o inverso da outra. Se forem iguais em todos os elementos, você tem uma capicua.

Eu no ínicio também pensei em converter para string, depois até era mais fácil para inverter por era só chamar a strrev se não tou em erro ;D ..

Mas depois, apesar de ter ido pesquisar e ter mesmo usado essa idea da string, como ainda não tinha aprendido a passar de int para char e isso tudo, desisti da idea e decidi fazer de uma maneira mais matematica, até acho que foi como a prof explicou.. Mas se me ajudarem um bocado acho que volto á idea anterior... Eu tinha usado qualquer coisa sprintf e assim.. ;D

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

pode usar o itoa para fazer a conversao de int para string:

Em vez do itoa, que nao esta definido pelo Standard, e preferivel usar o sprintf (ou o snprintf se tiveres uma biblioteca C99).

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!

Posted

Entendi como usar o itoa, mas o sprintf não..

Pergunta, o itoa coloca o '\0' na string certo?

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

Entendi como usar o itoa, mas o sprintf não..

Podes usar o itoa() a vontade, mas convem que estejas alerta para o facto de nem todos os compiladores o reconhecerem (por exemplo o meu).

#include <stdio.h>

char buffer[100];
int valor = 42;
sprintf(buffer, "%d", valor); // buffer tem "42"

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!

Posted

Podes usar o itoa() a vontade, mas convem que estejas alerta para o facto de nem todos os compiladores o reconhecerem (por exemplo o meu).

#include <stdio.h>

char buffer[100];
int valor = 42;
sprintf(buffer, "%d", valor); // buffer tem "42"

Hum, certo.. Eu usei o sprintf.. Mas agora estou a ter problemas na função de inverter o numero:

void inverte (int *numero, int *numeroInvertido){
int inverso[10],x=0;
while(*numero/10!=0){
	inverso[x]=*numero%10;
	*numero=*numero/10;
	x++;
}
*numeroInvertido=0;
for(int i=0;i<x;i++){
	*numeroInvertido=*numeroInvertido+inverso[i]*(10*i);
}
}

O do while não chega a percorrer o numero todo, por causa da condição *numero/10!=0 , e depois o calculo também não está correcto..

Eu experimentei com o numero 195, o do while só guarda o numero 5 e o 9, não chega ao 1.. E depois no cálculo não faz a soma, retornou só 90.. pois fez 9*(10*1)..

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

nao seria melhor usar "strings" para ver se o numero e' capicua?

Mandar um apontador de int para uma funcao, para mim nao tem muito nexo(a menos que queres muda-lo).

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

nao seria melhor usar "strings" para ver se o numero e' capicua?

Mandar um apontador de int para uma funcao, para mim nao tem muito nexo(a menos que queres muda-lo).

pois mas este trabalho é mesmo de iniciação aos apontadores, e as funções foram dadas pela prof, as duas :s

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

tens que meter:

while(*numero!=0)

//ou 

do 
{
	inverso[x]=*numero%10;
	x++;
} while((*numero=*numero/10)!=0);

penso que nao seja suposto imprimir 360, penso que seja para imprimir a capicua se assim for, tas a fazer os calculos errados:

*numeroInvertido=*numeroInvertido+inverso[i]*pow(10,i);

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

tens que meter:

while(*numero!=0)

//ou 

do 
{
	inverso[x]=*numero%10;
	x++;
} while((*numero=*numero/10)!=0);

penso que nao seja suposto imprimir 360, penso que seja para imprimir a capicua se assim for, tas a fazer os calculos errados:

*numeroInvertido=*numeroInvertido+inverso[i]*pow(10,i);

Estava mesmo a corrigir a parte da soma, já tinha colocado o while(*numero!=0) (erro estupido XD), agora só estava a ver se arranjava forma de matematicamente substituir o pow ou outra função que me devolva a potência.. Thanks ;D

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

ja' agora, quando tiveres este tipo de problemas, usa um debugger, ajuda bastante, ou utilizas o mitico "printf debug" 😄

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

ja' agora, quando tiveres este tipo de problemas, usa um debugger, ajuda bastante, ou utilizas o mitico "printf debug" 😄

Um debugger, printf debug? XD, estas a falar em seguir a execução passo a passo?

Já agora, o pow dá erro:

for(int i=0;i<x;i++){
	*numeroInvertido=*numeroInvertido+inverso[i]*pow(10,x-i-1);
}

diz: more than one instance of overloaded function pow matches the argument list: 

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

Um debugger, printf debug? XD, estas a falar em seguir a execução passo a passo?

Já agora, o pow dá erro:

for(int i=0;i<x;i++){
	*numeroInvertido=*numeroInvertido+inverso[i]*pow(10,x-i-1);
}

diz: more than one instance of overloaded function pow matches the argument list: 

tens que fazer um cast ao primeiro argumento para float ou double;

ja' agora nao era mais facil percorrer o ciclo ao contrario em vez de fazer o calculo(x-i-1)??

http://en.wikipedia.org/wiki/Debugger

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

... overloaded function ...

Hmmm, parece que estas a usar um compilador de C++.

Se queres escrever C, aconselho-te que uses um compilador de C, ou configuradopara C, para nao ganhares "defeitos" ao tentares fazer que o compilador de C++ aceite o teu codigo sem warnings.

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!

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.