Jump to content

numero contido noutro...


Flames
 Share

Recommended Posts

Boa noite, será que alguem conhece um algoritmo ----->sem utilizar arrays<----- para ver se um numero está contido noutro? Por exemplo numero 1234 dado pelo utilizador depois testando o numero 23 podemos ver que está contido já o numero 9 não está...

Eu sei que conseguimos alcançar cada numero fazendo divisoes sucessivas por 10 e buscar o resto e tal (já desenvolvi até um programa que faz a inversao) mas como alcanço por exemplo 1, 12,123,1234 dessa forma? Algo como prefixos...

Não espero que me fornecam qualquer programa apenas traços gerais de como chegar a isso :S

Obrigado desde já.

Link to comment
Share on other sites

Com divisões inteiras por 10.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Sugestao: sabes ver se uma string esta contida noutra? Usa o mesmo metodo para ver se um numero esta contido noutro ... se necessario depois de converteres um ou os dois numeros para strings.

Porque e que sugiro isto:

1) porque, de facto, estas a procura de strings, nao de numeros. Lembra-te que os numeros, internamente na memoria do computador, estao "escritos" em base 2.

2) porque, muito provavelmente, pelo menos um dos numeros comeca a vida como string e nao precisas de o converter para inteiro.

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!

Link to comment
Share on other sites

Sugestao: sabes ver se uma string esta contida noutra? Usa o mesmo metodo para ver se um numero esta contido noutro ... se necessario depois de converteres um ou os dois numeros para strings.

Porque e que sugiro isto:

1) porque, de facto, estas a procura de strings, nao de numeros. Lembra-te que os numeros, internamente na memoria do computador, estao "escritos" em base 2.

2) porque, muito provavelmente, pelo menos um dos numeros comeca a vida como string e nao precisas de o converter para inteiro.

Mas mesmo "transformando" em string's vou testar em termos de array o que eu não pretendia...

Link to comment
Share on other sites

Mas mesmo "transformando" em string's vou testar em termos de array o que eu não pretendia...

Ah! Pois. Entao tens que usar a sugestao do KTachyon (nao te esquecas que podes usar % para calcular o resto da divisao).

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!

Link to comment
Share on other sites

Sugestao: sabes ver se uma string esta contida noutra? Usa o mesmo metodo para ver se um numero esta contido noutro ... se necessario depois de converteres um ou os dois numeros

E em ansi c como e faz a conversão de inteiros para strings? Acho que o itoa não dá..

Link to comment
Share on other sites

Estou com um problema por exemplo numero 123 se for buscar o resto por 10 consigo alcancar o 3... Depois divido por 10 consigo alcancar o 12 blabla por ai fora até a divisao ser igual a 0 só que existe um numero que fica sempre fora o --->23<---. E quantos mais digitos pior fica. Por exemplo 1234 fica de fora para o teste o 23 e 34 como resolvo este problema? Já ando a volta disto a um tempo :S

Link to comment
Share on other sites

Estou com um problema por exemplo numero 123 se for buscar o resto por 10 consigo alcancar o 3... Depois divido por 10 consigo alcancar o 12 blabla por ai fora até a divisao ser igual a 0 só que existe um numero que fica sempre fora o --->23<---. E quantos mais digitos pior fica. Por exemplo 1234 fica de fora para o teste o 23 e 34 como resolvo este problema? Já ando a volta disto a um tempo :S

Tens que ver o resto por 10, por 100, por 1000, etc ... para cada numero obtido atraves da divisao do original por 1, 10, 100, 1000, ...

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!

Link to comment
Share on other sites

Estou com um problema por exemplo numero 123 se for buscar o resto por 10 consigo alcancar o 3... Depois divido por 10 consigo alcancar o 12 blabla por ai fora até a divisao ser igual a 0 só que existe um numero que fica sempre fora o --->23<---. E quantos mais digitos pior fica. Por exemplo 1234 fica de fora para o teste o 23 e 34 como resolvo este problema? Já ando a volta disto a um tempo :S

Se colocares aqui algum do código que tens, seria muito mais fácil....

Link to comment
Share on other sites

Se colocares aqui algum do código que tens, seria muito mais fácil....

estava a tentar nao meter aqui codigo que nao cabe na cabeca a ninguem...

double vercontido(n,contido){
    double i,j,inver;
    for (i=1;i<=4;i++){
        for (j=1;j<=4;j++){
            inver=n%pow(10,j); 
                  if (inver==contido)
                      return 1;
                  else
                      return 0;
         }
    n=n/pow(10,i);
   }
}

esta-me a dar erro no pow :S outra coisa é aquele ciclo estou a parar em 4 para testar como sei quando terminar ambos os ciclos é que me esta a fazer confusao :S

Ja está devidamente identado acho eu xp

Link to comment
Share on other sites

double vercontido(n,contido){
    double i,j,inver;
    for (i=1;i<=4;i++)
        for (j=1;j<=4;j++)
            inver=n%pow(10,j); 
            if (inver==contido)
                return 1;
            else
                return 0;
    n=n/pow(10,i);
    }

Atencao, atencao

A indentacao do teu codigo e a estrutura do mesmo nao sao equivalentes.

Estruturalmente o "if (inver)" esta fora dos ciclos "for", embora a indentacao leve a pensar o contrario.

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!

Link to comment
Share on other sites

Atencao, atencao

A indentacao do teu codigo e a estrutura do mesmo nao sao equivalentes.

Estruturalmente o "if (inver)" esta fora dos ciclos "for", embora a indentacao leve a pensar o contrario.

ja indentei o codigo em cima...

Link to comment
Share on other sites

ja indentei o codigo em cima...

Ok 😄

Agora o erro é no "if". Quer seja verdade quer seja falso a funcao acaba e devolve 1 ou 0. Nao executa mais nenhuma volta de nenhum ciclo.

Sugestao: nao facas o "return 0;" senao no final dos ciclos. Se a funcao chegar ao final dos ciclos é porque nao encontrou nenhum "sub numero".

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!

Link to comment
Share on other sites

Ok 😄

Agora o erro é no "if". Quer seja verdade quer seja falso a funcao acaba e devolve 1 ou 0. Nao executa mais nenhuma volta de nenhum ciclo.

Sugestao: nao facas o "return 0;" senao no final dos ciclos. Se a funcao chegar ao final dos ciclos é porque nao encontrou nenhum "sub numero".

algo como :

double vercontido(n,contido){
    double i,j,inver;
    for (i=1;i<=4;i++){
        for (j=1;j<=4;j++){
            inver=n%pow(10,j);
                  if (inver==contido)
                      return 1;
         }
    n=n/pow(10,i);
   }
return 0;
}

Desculpa já agora porque é que me dá este erro "invalid operands to binary %" eu sei que tem a haver com o inver=n%pow(10,j) mas não sei porque ja alterei o tipo mil e uma vez e mesmo assim :S

Link to comment
Share on other sites

algo como ... [return 0; no fim da funcao]

Yaaa 😄

Porque é que me dá este erro "invalid operands to binary %"?

Eu sei que tem a haver com o inver = n % pow(10, j) ...

Porque o "%" so esta definido para numeros inteiros e os teus operandos ("n" e pow(10, j)) sao numeros de virgula flutuante. A ideia para resolver o problema é essa, mas tens que a adaptar as manias do computador.

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!

Link to comment
Share on other sites

Yaaa 😄

Porque o "%" so esta definido para numeros inteiros e os teus operandos ("n" e pow(10, j)) sao numeros de virgula flutuante. A ideia para resolver o problema é essa, mas tens que a adaptar as manias do computador.

Como vou saber até que ciclo parar? Ou seja era necessario contar quantos numeros é constituido o numero dado pelo utilizador... Tenho que fazer um ciclo que me dê essa contagem para devolver para a outra funcao (int vercontido(int n,int contido) e assim ja saber até que %10, %100... o meu for vai.?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int vercontido(int n, int contido);
int main()
{
    int numero=1234;
    int contido=23;
    if (vercontido(numero,contido))
        printf("Esta contido\n");
    else
        printf("Nao esta contido");
return 0;
}
int vercontido(int n,int contido){
    int i,j,x=0;
    int aux_n=n;
    int aux2;
    for (i=1;i<=4;i++){
        for (j=1;j<=4;j++){
            aux2=pow(10,j);
            x=aux_n%aux2;
            if (x==contido)
                return 1;
        }
    aux_n=n/pow(10,i);
    }
return 0;
}




Link to comment
Share on other sites

Hmmm ... a medida que vais dividindo o numeor por 10 ele vai ficando mais pequeno. Com divisoes suficientes ha-de chegar a 0 🙂

E o aux2 ... a medida que o j aumenta, o aux vai ficando maior. Com aumentos suficientes ele fica tao grande que o resultado do modulo nunca muda 😄

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!

Link to comment
Share on other sites

Hmmm ... a medida que vais dividindo o numeor por 10 ele vai ficando mais pequeno. Com divisoes suficientes ha-de chegar a 0 🙂

E o aux2 ... a medida que o j aumenta, o aux vai ficando maior. Com aumentos suficientes ele fica tao grande que o resultado do modulo nunca muda 😄

No final ficou assim o código 🙂

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int vercontido(int n, int contido);
int main()
{
    int numero=1234567;
    int contido=4;
    if (vercontido(numero,contido))
        printf("Esta contido\n");
    else
        printf("Nao esta contido");
return 0;
}
int vercontido(int n,int contido){
    int i,j,x=0;
    int aux_n=n;
    int aux2;
    for (i=1;aux_n>0;i++){
        for (j=1;x!=aux_n;j++){
            aux2=pow(10,j);
            x=aux_n%aux2;
            if (x==contido)
                return 1;
        }
    aux_n=n/pow(10,i);
    x=0;
    }
return 0;
}


Link to comment
Share on other sites

No final ficou assim o código 🙂

Muito bom!

So uma coisita ... para chatear ... a tua funcao diz que 0 nao esta contido em 0 😄

E, uma sugestao: se os numeros a verificar nunca podem ser negativos eu faria os argumentos da funcao serem unsigned.

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!

Link to comment
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
 Share

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