Ir ao conteúdo

Posts recomendados

Postado

estou com um problema pra desenvolver um code e gostaria de dicas pra me ajudar como fazer meu code

Exercício:

Por questão de simplicidade, vamos trabalhar com a constante equivalente, 495, que resulta quando o mesmo processo é aplicado a números de 3 dígitos. Escreva um programa que verifique se essa constante realmente é gerada com a aplicação da rotina de Kaprekar a todos os números de 3 dígitos com pelo menos dois dígitos diferentes entre si (números entre 1 e 998, exceto os números 111, 222, 333, 444, 555, 666, 777, 888).

 

 

 

#include<stdio.h>
main(){
int v1,v2,aux,i=0,r,c;

printf("Tome qualquer número de 3 dígitos usando ao menos 2 dígitos diferentes: %d");
scanf("%d", &v1);
printf("digite o numero que escolheu de forma decrescente: %d");
scanf("%d", &v2);
if (v1<1000){
i++;
while (i != v1){
r = v1 - v2;
  printf("\nSubtracao = %d", r);
c==495

if ( r > c){
printf("não foi possivel calcular a constante com o numero desejado");
}

if(r==c){
printf("você achou a constante");
}
if(r<c){
printf("não foi possivel calcular a constante com o numero desejado");
}

if(aux==111 || aux==222 || aux==333 || aux==444 || aux==555 || aux==666 || aux==777 || aux==888);{
printf("não é possivel fazer a constante");}
}
}
}

 

Postado

@Will Thiele Você tirou print do programa? 🤔

Use o botão CODE "<>" para separar textos normais de códigos (blocos de programação) a fim de evitar que se confunda texto com código.

E antes de enviá-lo, faça comentários, assim todos podem entender o que se passa nele.

Postado

@Will Thiele Bem... Tem vários erros no seu programa, quase não entendi o que se passa nele.

Não coloque identificadores no printf.

Preferencialmente, use int main() ao invés de apenas main().

Tem várias chaves não fechadas... Enfim.

Primeiro de tudo, peça o valor, e se não cumprir os requisitos, ou seja, ser maior ou menor que 3 digitos, ter mais de 2 digitos iguais, ser menor que 1 e ser maior que 998, peça novamente.

Com isso, o que eu faria é o seguinte: você quer ordenar os números em ordem decrescente e subtrair por este mesmo número, só que com os dígitos invertidos, depois ordenar novamente e subtrair novamente, e que isso se repita até resultar em 495.

Armazene cada dígito em um vetor com um loop e os compare para ver qual é maior, e assim ordená-los. Para obter um número apenas, basta concatenar. Depois pegue este resultado e inverta-o, subtraia o primeiro do segundo e você vai ter seu primeiro resultado da rotina, isso terá que se repetir até resultar em 495.

Eu reciclei as variáveis conc e conc2 no programa a seguir, sendo conc o valor com os números em ordem crescente e conc2 este valor invertido, depois é subtraído conc2 de conc e o ciclo se repete:

#include<stdio.h>
#include <locale.h>

int main(){
    
    setlocale(LC_ALL, "Portuguese");    
    int n, dig[5], dig2[5], conc, conc2, i, cont = 0, num;
    
    printf("Digite um número de 3 dígitos com ao menos 2 dígitos diferentes: ");
    scanf("%d", &n);
    num = n;
    do
    {
        cont++;
        num /= 10;
    } while(num != 0);
    while (cont != 3 || n < 1 || n > 998 || n==111 || n==222 || n==333 || n==444 || n==555 || n==666 || n==777 || n==888){
        //Verificando valor inválido
        cont = 0;
        printf("Valor inválido! Digite o número novamente: ");
        scanf("\n%d", &n);
        num = n;
        do
        {
            cont++;
            num /= 10;
        } while(num != 0);
    }

    conc = n;
    while(conc != 495){ //Enquanto não obter 495, repete
        i = 0;
        
        while(conc) //Armazenar cada dígito em um vetor
        {
            i += 1;
            dig[i] = conc % 10;
            conc /= 10;
        }
        //Ver qual é maior, e concatenar
        if((dig[3]>dig[2] && dig[2]>dig[1]) || (dig[3]==dig[2] && dig[2]>dig[1]) || (dig[1]==dig[2] && dig[2]<dig[3])){
            conc = ((dig[3]*100)+(dig[2]*10)+dig[1]);
        } else if ((dig[3]>dig[1] && dig[1]>dig[2]) || (dig[3]==dig[1] && dig[1]>dig[2])){
            conc = ((dig[3]*100)+(dig[1]*10)+dig[2]);
        } else if ((dig[2]>dig[3] && dig[3]>dig[1]) || (dig[1]==dig[3] && dig[3]<dig[2])){
            conc = ((dig[2]*100)+(dig[3]*10)+dig[1]);
        } else if ((dig[2]>dig[1] && dig[1]>dig[3]) || (dig[2]==dig[1] && dig[1]>dig[3])){
            conc = ((dig[2]*100)+(dig[1]*10)+dig[3]);
        } else if (dig[1]>dig[3] && dig[3]>dig[2]){
            conc = ((dig[1]*100)+(dig[3]*10)+dig[2]);
        } else if ((dig[1]>dig[2] && dig[2]>dig[3]) || (dig[2]==dig[3] && dig[3]<dig[1])){
            conc = ((dig[1]*100)+(dig[2]*10)+dig[3]);
        }
        conc2 = conc;
        i = 0;
        while(conc2) //Armazenar cada dígito em um vetor
        {
            i += 1;
            dig2[i] = conc2 % 10;
            conc2 /= 10;
        }
        //Concatenar invertido
        conc2 = ((dig2[1]*100)+(dig2[2]*10)+dig2[3]);
        conc -= conc2; //Primeiro resultado da rotina
        if (conc <= 99){
            printf("\nNão foi possível gerar a constante!");
            return 0;
        }
    }
    printf("Aplicando a rotina de Kaprekar...\n");
    printf("Sucesso! Resultou em: %d", conc);
    return 0;
}

Ta escrito "números entre 1 e 998", mas têm que ser números com 3 dígitos, e para 998 não dá:

998 - 899 = 99

Teste aí para o número 574, você tem que obter isso:

754 - 457 = 297

972 - 279 = 693

963 - 369 = 594

954 - 459 = 495

Postado
#include <stdio.h>

int KaprekarRoutine3digits(int n){
    int count, i, digit[3], temp, biggest, smallest;
    
    temp = n;
    for (count = 1; n != 495 && n != 0; count++){
        //zera os digitos
        digit[0] = 0;
        digit[1] = 0;
        digit[2] = 0;
        
        //separa os digitos do numero
        for (i=0; n > 0; i++){
            if(i >= 3) {
                printf("Erro: O numero %d tem mais de 3 digitos.\n", temp);
                return -1;
            }
            digit[i] = n % 10;
            n /= 10;
        }
        
        //ordena os digitos em ordem crescente
        for (i=0; i<2; i++){
            if (digit[i] > digit[i+1]){
                temp = digit[i];
                digit[i] = digit[i+1];
                digit[i+1] = temp;
            }
        }
        if (digit[0] > digit[1]){
            temp = digit[0];
            digit[0] = digit[1];
            digit[1] = temp;
        }
        
        //maior e menor numero com os digitos
        biggest = digit[2]*100 + digit[1]*10 + digit[0];
        smallest = digit[0]*100 + digit[1]*10 + digit[2];
        
        n = biggest - smallest;
    }
    
    if (n == 495) return count;
    
    return 0;
}

int main()
{
    int a, iteracoes;
    
    FILE *f = fopen("saidakaprekar.txt", "w");
    for (a=1; a<1000; a++){
        iteracoes = KaprekarRoutine3digits(a);
        if (iteracoes > 0){
            fprintf(f, "%03d -> %d iteracoes\n", a, iteracoes);
        }
        else if (iteracoes == 0){
            fprintf(f, "%03d -> TODOS OS DIGITOS SAO IGUAIS\n", a);
        }
    }
    fclose(f);
    
    return 0;
}

 

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