Ir ao conteúdo

Posts recomendados

Postado
main()
{
int i, j, num[3], numInvertido[3]={0}; //contador
printf("Digite o numero: ");
scanf("%d", &num);
    for(int i = 0, j = 2; i < 3; i++, j--)
        numInvertido[j] = num[i];
    for(i = 0; i < 3; i++)
        printf("%d", numInvertido[i]);
}

/*3 - Escreva um programa para ler um numero inteiro, positivo de tres digitos, e gere
    outro número formado pelos dígitos invertidos do número lido.
    Ex:   NúmeroLido = 123
        NúmeroGerado = 321*/

 

já resolvi com string, mas não quero usar string.

  • Obrigado 1
Postado

@Malcolm X   você pode usar o operador mod , para fragmentar o número do tipo int e já vai saindo invertido .

#include <stdio.h>
int main(){
    int f,num=123;
    for(f=0; f<3; f++){
        printf("%d",num % 10);
        num/=10;
    }
    return 32768;
}

 

  • Curtir 1
Postado

Consegui resolver o que eu queria:

 

main()
{
    int i, j, num[3], numInvertido[3]; //contador
    printf("Digite o numero: ");
        for(i = 0; i<3; i++)
            scanf("%d", &num);
        for(i = 0, j = 2; i < 3; i++, j--)
            numInvertido[j] = num;
        for(i = 0; i < 3; i++)
            printf("%d", numInvertido);
}

 

se alguém quiser complementar ou diminuir os 3 for fiquem a vontade

 

obs.: o único problema é q para o usuário digitar ele vai ter q apertar enter para cada numero digitado, talvez fuja um pouco da questão por causa disso, já que é apenas um número inteiro de três dígitos. 

  • Curtir 1
Postado

Pegando gancho na sugestão de @devair1010, uma solução poderia ser assim:

#include <stdio.h>


int main()
{
    int i = 100, num, numInvertido=0; //contador
    printf("Digite o numero: ");
    scanf("%d", &num);
    while (i > 0)
    {
        numInvertido += (num % 10) * i;
        num /= 10;
        i /= 10;
    }
    
    printf("%d", numInvertido);
}

 

  • Curtir 1
  • Obrigado 1
Postado
19 horas atrás, Malcolm X disse:

Consegui resolver o que eu queria:

 


main()
{
    int i, j, num[3], numInvertido[3]; //contador
    printf("Digite o numero: ");
        for(i = 0; i<3; i++)
            scanf("%d", &num);
        for(i = 0, j = 2; i < 3; i++, j--)
            numInvertido[j] = num;
        for(i = 0; i < 3; i++)
            printf("%d", numInvertido);
}

 

se alguém quiser complementar ou diminuir os 3 for fiquem a vontade

 

obs.: o único problema é q para o usuário digitar ele vai ter q apertar enter para cada numero digitado, talvez fuja um pouco da questão por causa disso, já que é apenas um número inteiro de três dígitos. 

 

Não, não resolveu. 


Isso é basicamente fazer o que faria com a string. Mas sem usar string.
Digitando os números um a um ao invés de separar os dígitos na string usando o índice. É muito apelativo fazer com que o usuário entre com um dígito por vez... 

 

Ler como string é mais simples e intuitivo. E sempre inverte e reverte ok.

 

E tem um outro problema:
 

Citação

do ponto de vista matemático, uma inversão é reflexiva: o inverso do inverso é a identidade


Se f(x) é inversível então
 

        f( f(x) ) = x para todo x.

Escrevendo isso em C


Se sua função é

        int inverte_r(int);

Então

       (inverte_r(inverte_r(i)) == i)        // para todo i.

 

De todo modo essa acho que é a solução comum do modo como quer fazer:

 

int inverte_d(int in)
{
    int out = 0;
    while (in > 0)
    {
        out = 10 * out + in % 10;
        in = in / 10;
    };
    return out;
}

E essa é a mais cult:

int inverte_r(int v)
{
    static int i = 0;
    if (v <= 0)
    {   v = i; i = 0;
        return v;
    };  // if()
    i = (10 * i) + (v % 10);
    return inverte_r(v / 10);
};

Para qualquer i. Tanto faz ter 3 dígitos.

 

Considerando o fato de só ter 3 dígitos pode escrever o óbvio:

int inverte_3(int in)
{
    if (in > 99) return (in / 100) + ((in % 100) / 10) * 10 + (in % 10) * 100;
    if (in >  9) return (in % 10 * 10) + (in /10);
                 return in;
};

 

E as 3 funcionam igual

 

Mas apesar de inverter não vai ser mesmo reversível para esses números:

[010 001] [020 002] [030 003] [040 004] [050 005]
[060 006] [070 007] [080 008] [090 009] [100 001]
[110 011] [120 021] [130 031] [140 041] [150 051]
[160 061] [170 071] [180 081] [190 091] [200 002]
[210 012] [220 022] [230 032] [240 042] [250 052]
[260 062] [270 072] [280 082] [290 092] [300 003]
[310 013] [320 023] [330 033] [340 043] [350 053]
[360 063] [370 073] [380 083] [390 093] [400 004]
[410 014] [420 024] [430 034] [440 044] [450 054]
[460 064] [470 074] [480 084] [490 094] [500 005]
[510 015] [520 025] [530 035] [540 045] [550 055]
[560 065] [570 075] [580 085] [590 095] [600 006]
[610 016] [620 026] [630 036] [640 046] [650 056]
[660 066] [670 076] [680 086] [690 096] [700 007]
[710 017] [720 027] [730 037] [740 047] [750 057]
[760 067] [770 077] [780 087] [790 097] [800 008]
[810 018] [820 028] [830 038] [840 048] [850 058]
[860 068] [870 078] [880 088] [890 098] [900 009]
[910 019] [920 029] [930 039] [940 049] [950 059]
[960 069] [970 079] [980 089] [990 099]


Porque no sistema posicional tem o elemento neutro então onde tem um zero à esquerda vai falhar. 820 vira 28 mas 28 vira 82...

 

Um programa de teste em C que mostra os valores que não são inversíveis e compara os resultados  das 3 funções:

Spoiler

#include <stdio.h>
int inverte_3(int);
int inverte_d(int);
int inverte_r(int);


int main(void)
{
    int col = 0;

    for (int i = 1; i <= 999; i += 1)
    {
        if (inverte_r(inverte_r(i)) != i)
        {
            printf("[%03d %03d] ", i, inverte_r(i));
            col += 1;
            if (col % 5 == 0) printf("\n");
        };
    };
    if (col % 5 == 0) printf("\n");
    
    printf("\n\nComparando as 3 funcoes:\n");
    for (int i = 1; i <= 999; i += 1)
    {
        if (
            (inverte_r(i) != inverte_d(i)) ||
            (inverte_r(i) != inverte_3(i)))
        {
            printf("Diferem para i = %d\n", i);
            printf("[3,d,r] = [%03d %03d %03d]\n",
                inverte_3(i), inverte_d(i), inverte_r(i));
        };  // if()
    };  // for()
    printf("\nFinal da comparacao\n");

    printf("\n\nFinal...");
    return 0;
}; 

int inverte_3(int in)
{
    if (in > 99) return (in / 100) + ((in % 100) / 10) * 10 + (in % 10) * 100;
    if (in >  9) return (in % 10 * 10) + (in /10);
                 return in;
};

int inverte_d(int in)
{
    int out = 0;
    while (in > 0)
    {
        out = 10 * out + in % 10;
        in = in / 10;
    };
    return out;
};

int inverte_r(int v)
{
    static int i = 0;
    if (v <= 0)
    {
        v = i; i = 0;
        return v;
    };  // if()
    i = (10 * i) + (v % 10);
    return inverte_r(v / 10);
};

 

 

 

 

 

 

  • Obrigado 2
Postado

Nesse exercício, o como resolvi não importa. Ou seja, única resposta inesperada é aquela que produz o resultado errado. 

 

Esqueceu no post#3 os índices nos vetores: num, numInvertido.

  • Amei 1
  • Triste 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...