Ir ao conteúdo
  • Cadastre-se
Jessé P. de Melo

C Entendendo o exercício (matematica)

Recommended Posts

Boa tarde.

Estou com duvidas sobre o que esse exercício pede, entendi a parte dos cinco dígitos consecutivos na sequencia, já a parte dos produto ficou confusa, esta pedindo para encontrar o maior resultado da multiplicação dos cinco dígitos?

 

Segue exercício.

 

Faca um programa que encontre o conjunto de 5 digitos consecutivos na sequencia  abaixo que gere o maior produto:

73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042

24219022671055626321111109370544217506941658960408 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu imagino que basta selecionar 5 números consecutivos e multiplicar todos eles um pelo outro, depois repetir até o fim da lista sempre guardando o índice do primeiro número da sequência que gerar o maior produtor. Por fim apresenta-la

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 minutos atrás, AnsiC disse:

Eu imagino que basta selecionar 5 números consecutivos e multiplicar todos eles um pelo outro, depois repetir até o fim da lista sempre quando o índice do primeiro número da sequência que gerar o maior produtor. Por fim apresenta-la

Parando pra pensar acho que você tem razão, tinha esquecido que produto normalmente é o resultado da multiplicação, acho que sua resposta tá certa.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voltei... pensei em uma solução, porém não estou conseguindo implementar. Sei que esta bastante repetitivo porém assim fica mais fácil de compreender, quando estiver tudo funcionando arrumo. Esta compilando sem erros, mas não faz o esperado.

 

Segue código.

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

void main (void){
    char lista[]="7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
    int valor_atual=0; // Variavel para receber valores do calculo para comparação
    int valor_novo=0;  // Variavel para receber valores do calculo para comparação

    for (int x=0;x<1000;x++){ // Loop que percorre todo o vetor, joguei o texto no word e deu 1000 caracteres

    char caractere[1]; // Strings para receber valor individual do vetor se ficar sem o programa não identifica o \0 e o resultado sai bizarro.
    char caractere1[1];
    char caractere2[1];
    char caractere3[1];
    char caractere4[1];

    int numero; //primeiro numero do vetor

    caractere[0]=lista[x]; // isola membros a membro do indice
    caractere1[0]=lista[x+1];
    caractere2[0]=lista[x+2];
    caractere3[0]=lista[x+3];
    caractere4[0]=lista[x+4];
    caractere[1]='\0';
    caractere1[1]='\0';
    caractere2[1]='\0';
    caractere3[1]='\0';
    caractere4[1]='\0';

    numero=atoi(caractere); //conversão do primeiro valor do indice deixa de ser caracter alfanumerico e vira numero inteiro

        if ((atoi(caractere)==numero)&&(atoi(caractere1)==numero+1)&&(atoi(caractere2)==numero+2)&&(atoi(caractere3)==numero+3)&&(atoi(caractere4)==numero+4)){ //converte o segundo caracter e compara com numero, converte o segundo caractere e compara com numero+1 e assim por diante 4x. Isso garante que os numeros são consecutivos. porém acredito que esteja dando erro.
            valor_novo=numero*(numero+1)*(numero+2)*(numero+3)*(numero+4);
            if (valor_novo>valor_atual){
                valor_atual=valor_novo;
            }
        }
    }
    printf("O maior produto de cinco digitos consecutivos da lista e': %i",valor_atual);

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz assim, e coloquei comentários explicando:

#include <stdio.h>
#include <string.h>

int main()
{
    char lista[]="7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
    int maxmult = 0, mult, pos;
  
    int tam = strlen(lista); //Tamanho do vetor lista
    
    //O ciclo para 5 posições antes do fim da string,
    //pois é a posição do último grupo de 5 dígitos consecutivos
    for(int i=0; i < tam-4; i++){
        mult = 1; //Inicializa mult
        for(int j=0; j < 5; j++){
            //Converte de caractere para número inteiro e multiplica pelos anteriores
            mult *= lista[i+j] - '0';
        }
        //Acha o valor máximo
        if(maxmult < mult){
            //Atualiza máximo se encontrou um novo máximo
            maxmult = mult;
            //Guarda a posição onde começam os 5 dígitos
            pos = i; 
        }
    }
    
    //Imprime os 5 dígitos consecutivos cuja multiplicação tem maior valor
    for(int j=0; j < 5; j++){
        printf("%c", lista[pos+j]);
    }
    printf("\n");

    return 0;
}

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Boa...sua logica é parecida com a minha só que seu código está muito mais limpo. Alias, o meu esta aquela bagunça por que estava tendo problemas até para printar resultados isolados, ai fiz a conversão do texto de maneira redundante e manualmente. Vou ver se encontro o erro...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

@isrnick, sobre:

8 horas atrás, isrnick disse:

//Converte de caractere para número inteiro e multiplica pelos anteriores
mult *= lista[i+j] - '0';

 

Como funciona essa conversão com o "-'0'"?

adicionado 15 minutos depois

 

 

@Jessé P. de Melo, sobre:

9 horas atrás, Jessé P. de Melo disse:

printf("O maior produto de cinco digitos consecutivos da lista e': %i",valor_atual);

 

Vide o enunciado:

17 horas atrás, Jessé P. de Melo disse:

Faca um programa que encontre o conjunto de 5 digitos consecutivos na sequencia  abaixo que gere o maior produto:


Ou seja, supostamente é para exibir os 5 dígitos. não o seu produto.

 

Observação 1: ele apenas pede para ENCONTRAR, não diz sobre como "provar que encontrou", mas subentendem-se que seria ou exibir os 5 números, como feito por @isrnick ou , por exemplo, indicar a posição onde começa a sequência (vale saliente que nesse caso entra a questão de um possível empate).... ou alguma outra forma... em fim, podem existir outras possibilidades, mas creio que "exibir o maior produto" não seja ela. Poderia exibir a sequência E exibir o seu produto... mas o foco em si é a sequência...

 

Observação 2: Ter o produto da sequência seria apenas um mecanismo, não o fim.

 

 

No aguardo.

adicionado 18 minutos depois

PS:

 

9 horas atrás, Jessé P. de Melo disse:

if ((atoi(caractere)==numero)&&(atoi(caractere1)==numero+1)&&(atoi(caractere2)==numero+2)&&(atoi(caractere3)==numero+3)&&(atoi(caractere4)==numero+4)){ //converte o segundo caracter e compara com numero, converte o segundo caractere e compara com numero+1 e assim por diante 4x. Isso garante que os numeros são consecutivos. porém acredito que esteja dando erro.

 

Não entendi qual seria a sua lógica. Como deveria funcionar essas comparações?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Se der me retorna a sequencia de números que encontrou. Refiz o exercício de maneira mais simples porque não estava dando certo. Os números que encontrei na lista com maior sequencia foi  78911 - 67881 - 34506 - 56748 -12316 - 45665 - 45682 - 12309. Com apenas o n1==n+1 && n2=n+2 do IF.

 

Sabe me informar porque com mais de um '&&' o programa não funciona?

 

Seria muito agradecido se conseguisse fazer o código que segue funcionar. Fica mais fácil para entender.onde errei.

 

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

void main (void){
    char lista[]="7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
    int valor_atual=0; // Variavel para receber valores do calculo para comparação
    int valor_novo=0;  // Variavel para receber valores do calculo para comparação
    int tam;

    tam=strlen(lista);

    for(int x=0;x<tam-4;x++){

        char caractere[2];
        char caractere1[2];
        char caractere2[2];
        char caractere3[2];
        char caractere4[2];

        caractere[1]='\0';
        caractere1[1]='\0';
        caractere2[1]='\0';
        caractere3[1]='\0';
        caractere4[1]='\0';

        caractere[0]=lista[x];
        caractere1[0]=lista[x+1];
        caractere2[0]=lista[x+2];
        caractere3[0]=lista[x+3];
        caractere4[0]=lista[x+4];

        int n=atoi(caractere);
        int n1=atoi(caractere1);
        int n2=atoi(caractere2);
        int n3=atoi(caractere3);
        int n4=atoi(caractere4);

        /*printf("%i%i%i%i%i\n",n,n1,n2,n3,n4); //print para verificar o que foi convertido para testes */

            if((n1==n+1)&&(n2==n+2)&&(n3==n+3)&& (n4==n+4)){
                printf("numeros: %i%i%i%i%i\n",n,n1,n2,n3,n4);
                if(valor_novo>valor_atual){
                    valor_atual=valor_novo;
                }
            }
    }
}

 

  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jessé P. de Melo

Você está assumindo que os números são progressivos, crescentes e de razão igual a 1. No mínimo foi o que tirei do código acima. Porém isso não foi dito aqui:

19 horas atrás, Jessé P. de Melo disse:

Faca um programa que encontre o conjunto de 5 digitos consecutivos na sequencia  abaixo que gere o maior produto

  • Só para entender a complexidade: [2 5 8 11 14],  [2 6 18 24],  [segunda terça quarta quinta sexta].

O último exemplo são palavras que representa números consecutivos, o índice da lista representa uma sucessão entre os números que se posicionam na lista de forma progressiva conforme o índice, inclusive essa é a solução que propõe@isrnick .

 

Na minha opinião estão os dois apenas na metade do caminho, ou para facilitar o enunciado mal informado, pois números podem ser consecutivos tanto crescente quando decrescente e a ordem de sucessão não precisa ser necessariamente de grau 1. Salvo os casos em isso seja especificado.

  • Curtir 3
  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jessé P. de Melo aqui o n1==n+1 && n2==n+2 e etc, parece estar funcionando corretamente, mas como essa condição nunca é satisfeita ele nunca entra no if.

 

Você está entendendo errado o que o enunciado quer dizer com "dígitos consecutivos", ele está querendo que as posições dos dígitos na string sejam consecutivos, não que os próprios dígitos estejam em ordem crescente.

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, isrnick disse:

Você está entendendo errado o que o enunciado quer dizer com "dígitos consecutivos", ele está querendo que as posições dos dígitos na string sejam consecutivos, não que os próprios dígitos estejam em ordem crescente.

Eu também entendi assim...

 

Mas o de fato o "dígitos consecutivos" podem levar a outras interpretações... Eu acho que prevalece o mais "simples", rs. Seria uma boa verificar com o "dono" do enunciado. kkkkk

adicionado 2 minutos depois

 

 

3 minutos atrás, isrnick disse:

@Jessé P. de Melo aqui o n1==n+1 && n2==n+2 e etc, parece estar funcionando corretamente, mas como essa condição nunca é satisfeita ele nunca entra no if.

Pra ver como entender o problema é principal.... ou seja, se está funcionado, estaria fazendo certo para algo errado. :D

 

 

adicionado 3 minutos depois

PS: ou não!

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Simon Viegas disse:

Mas o de fato o "dígitos consecutivos" podem levar a outras interpretações... Eu acho que prevalece o mais "simples", rs. Seria uma boa verificar com o "dono" do enunciado. kkkkk

Por questão de pragmatismo, eu considero a interpretação de @isrnick  'a ideal', tanto quanto a solução introduzida por @Jessé P. de Melo

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas  Pra entender a conversão para inteiro usando o " - '0' " primeiro precisa entender que o tipo char são números inteiros, no caso char é o menor tipo inteiro da linguagem C, com apenas 8 bits (indo de -128 até 127 com sinal, e indo de 0 a 255 quando sem sinal).

 

É fácil verificar isso vendo que você pode imprimir um char como número inteiro:

printf("%hhd\n", 'A');

No caso acima será impresso o número 65 no terminal. Ou seja, 'A' == 65. E quando fazemos a atribuição "char ch = 'A';" o que será guardado na variável ch é o número 65.

 

O que o printf faz quando usamos %c como especificador para imprimir o valor armazenado numa variável char, é usar uma tabela para ver qual o caractere que corresponde ao número armazenado na variável, e imprime esse caractere.

 

printf("%c\n", 65); //Imprime o caractere A no terminal

 

Existem várias tabelas de caracteres (ASCII, UTF-8, Unicode, etc), mas para os caracteres básicos do alfabeto (letras maiúsculas e letras minúsculas) assim como dígitos (0 a 9), elas costumam ser iguais ao da tabela ASCII que é uma tabela bem simples.

 

Então, no caso dos dígitos 0 a 9, eles correspondem respectivamente aos números decimais indo de 48 a 57 na tabela ASCII.

 

E como os dígitos estão em sequência na tabela, indo de 0 a 9, podemos obter o número correspondente subtraindo 48 do caractere.

char ch = '5'; //ch == 53

int n = ch - 48; // n == 5

Mas note que fazer assim exige que você consulte a tabela ASCII toda vez, ou decore o número correspondente ao caractere '0'.

 

 

Uma maneira melhor de fazer isso é apenas lembrar que os caracteres dos dígitos são em sequência na tabela, e usar o próprio caractere '0' na subtração, assim não precisa lembrar qual o número decimal correspondente na tabela.

int n = '5' - '0'; // == 53 - 48 == 5

Desta maneira também é mais descritivo, facilitando o entendimento pra quem ler o código.

 

 

Isso também é útil para fazer comparações, por exemplo ch >= '0' && ch <= '9' para checar o caractere é um dígito. E o mesmo vale para letras maiúsculas ch >= 'A' && ch <= 'Z', e letras minúsculas ch >= 'a' && ch <= 'z'.

 

Você também pode obter um número de 0 a 25 correspondente a letra maiúscula fazendo a subtração do caractere 'A' (ou subtrai 'a' para letra minúscula). O @Poisoned00 usou essa propriedade no programa dele nesse tópico num programa para contar quantas vezes um caractere se repete.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

É com muito desgosto que informo que não consegui solucionar o problema, talvez ele tenha feito isso para trolar.

O máximo que consegui filtrar retornou esses valores tanto crescente quanto decrescente procurando da direita para esquerda ou esquerda para direita:  78911-67881-34506-56748-12316-45665-45682-12309-60789-33678-24345-46567-19123-12456-65456-98123-12545-08634-26956-60789-33678-24345-46567-19123-12456-65456-98123.

Muito provavelmente ele trollou ou errou e no lugar dos digito (0 ao 9) quis dizer inteiros (∞). Se for inteiro não sei com resolver porque pode ser um inteiro de um digito, ou dois, e ou assim por diante, e se no meio do processamento mudar de casas(dezena para centena) tipo 96979899100. Não dou conta não vou esperar um veterano.

 

Segue meu código:

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

void main (void){
    char lista[]="7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
    int valor_atual=0; // Variavel para receber valores do calculo para comparação
    int valor_novo=0;  // Variavel para receber valores do calculo para comparação
    int tam;

    tam=strlen(lista);

    for(int x=0;x<tam-4;x++){

        char caractere[2];
        char caractere1[2];
        char caractere2[2];
        char caractere3[2];
        char caractere4[2];

        caractere[1]='\0';
        caractere1[1]='\0';
        caractere2[1]='\0';
        caractere3[1]='\0';
        caractere4[1]='\0';


        caractere[0]=lista[x];
        caractere1[0]=lista[x+1];
        caractere2[0]=lista[x+2];
        caractere3[0]=lista[x+3];
        caractere4[0]=lista[x+4];

        int n=atoi(caractere);
        int n1=atoi(caractere1);
        int n2=atoi(caractere2);
        int n3=atoi(caractere3);
        int n4=atoi(caractere4);

        /*printf("%i%i%i%i%i\n",n,n1,n2,n3,n4); //print para verificar o que foi convertido para testes */

            if((n1==n+1)&&(n2==n+2)&&(n3==n+3)&& (n4==n+4)){
                printf("numeros crescentes: %i%i%i%i%i\n",n,n1,n2,n3,n4);
                valor_atual=n*n1*n2*n3*n4;
                if(valor_novo>valor_atual){
                    valor_atual=valor_novo;
                }
            }
    }
    for(int x=0;x+4<tam;x++){
        char caractere[2];
        char caractere_1[2];
        char caractere_2[2];
        char caractere_3[2];
        char caractere_4[2];

        caractere[1]='\0';
        caractere_1[1]='\0';
        caractere_2[1]='\0';
        caractere_3[1]='\0';
        caractere_4[1]='\0';

        caractere[0]=lista[x];
        caractere_1[0]=lista[x-1];
        caractere_2[0]=lista[x-2];
        caractere_3[0]=lista[x-3];
        caractere_4[0]=lista[x-4];

        int n=atoi(caractere);
        int n_1=atoi(caractere_1);
        int n_2=atoi(caractere_2);
        int n_3=atoi(caractere_3);
        int n_4=atoi(caractere_4);

         if((n_1==n-1)&&(n_2==n-2)&&(n_3==n-3)&& (n_4==n-4)){
            printf("numeros decrescentes: %i%i%i%i%i\n",n_4,n_3,n_2,n_1,n);
            valor_atual=n_4*n_3*n_2*n_1*n;
            if(valor_novo>valor_atual){
                valor_atual=valor_novo;
            }
         }
    }
}


 

  • Triste 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Jessé P. de Melo disse:

É com muito desgosto que informo que não consegui solucionar o problema, talvez ele tenha feito isso para trolar.

Ai que está @Jessé P. de Melo eu acredito que você poça resolver porque na minha opinião a solução ficou parcialmente certa, já que o enunciado apela para subjetividade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jessé P. de Melo Você ainda está usando comparações entre os dígitos (n1 == n+1 e etc), mas como falamos não é isso que o exercício pede.

 

 Aqui o seu código corrigido:

 

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

int main (void){
    char lista[]="7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
    int valor_atual=0; // Variavel para receber valores do calculo para comparação
    int valor_novo=0;  // Variavel para receber valores do calculo para comparação
    int tam;
    int p; // Variavel para armazenar a posição dos 5 digitos com maior produto

    tam=strlen(lista);

    for(int x=0;x<tam-4;x++){

        char caractere[2];
        char caractere1[2];
        char caractere2[2];
        char caractere3[2];
        char caractere4[2];

        caractere[1]='\0';
        caractere1[1]='\0';
        caractere2[1]='\0';
        caractere3[1]='\0';
        caractere4[1]='\0';

        caractere[0]=lista[x];
        caractere1[0]=lista[x+1];
        caractere2[0]=lista[x+2];
        caractere3[0]=lista[x+3];
        caractere4[0]=lista[x+4];

        int n=atoi(caractere);
        int n1=atoi(caractere1);
        int n2=atoi(caractere2);
        int n3=atoi(caractere3);
        int n4=atoi(caractere4);

        /*printf("%i%i%i%i%i\n",n,n1,n2,n3,n4); //print para verificar o que foi convertido para testes */
        
        valor_novo = n*n1*n2*n3*n4;
        if(valor_novo > valor_atual){
            valor_atual = valor_novo;
            p = x;
        }
    }
    
    printf("%c%c%c%c%c\n", lista[p], lista[p+1], lista[p+2], lista[p+3], lista[p+4]);
    
    return 0;
}

Esse programa imprime apenas 1 conjunto de 5 digitos, mas poderia existir mais de 1 grupo que o produto dá igual ao valor máximo do produto, o exercício poderia pedir que mostre todos eles, e isso aumentaria a complexidade do programa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Esse trecho é para comparar o valor inicial com valores de posições. 'n' sempre vai ser o inicio independente se começa da esquerda ou da direita. Se eles são consecutivos (4,3,2.1,0,1,2,3,4) :

A posição atual comparada a sua direita soma um.

   Ex: n=0 então para ser consecutivo n1=0+1 logo n2=0+2;

A posição atual comparada a sua esquerda subtrai um.

  Ex n=4 então para ser consecutivo n3=4-1 logo n2=4-2

Sei que não é a melhor maneira já que tudo e feito em relação ao primeiro e não ao antecessor, mas resolve. Sem isso só se multiplica os valores dos índices de verificar.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
23 horas atrás, AnsiC disse:

Eu imagino que basta selecionar 5 números consecutivos e multiplicar todos eles um pelo outro, depois repetir até o fim da lista sempre guardando o índice do primeiro número da sequência que gerar o maior produtor. Por fim apresenta-la

O que me ocorrerá é que: 5 dígitos são consecutivos se apresentarem certo grau de sucessão positivo ou negativo, porém absolutos iguais. Exemplo:

 

2 horas atrás, Jessé P. de Melo disse:

O máximo que consegui filtrar retornou esses valores tanto crescente quanto decrescente procurando da direita para esquerda ou esquerda para direita:  78911-67881-34506-56748-12316-45665-45682-12309-60789-33678-24345-46567-19123-12456-65456-98123-12545-08634-26956-60789-33678-24345-46567-19123-12456-65456-98123.

79811: está parcialmente correto porque se ordenado temos: 7891'1' esse último 1 é que está errado. Pois o maior valor de sucessão é 9 na sequência de grau +1 ao adicionar +1 na sucessão o resultado deveria ser 0. ficaria assim:

78901 CORRETA 

 

 

67881: estrá parcialmente correto porque se ordenado temos: '1'678'8' esse 1 é que está errado. Pois o maior valor de sucessão é 9 e o menor é 0. na sequência de grau +1 ao adicionar +1 na sucessão o resultado deveria ser 5, porém se no lugar de '8' temos ficaria assim:

67890 CORRETA ou

56789 CORRETA.

 

 

12456: está perfeita!

 

Ou seja, no meu entender você quase consegue;

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Desculpe entendi só agr o que estava querendo dizer. Você quis dizer que segue um padrão e não necessariamente sequencial ordenado.

Só consegui entender depois de ler e reler a resposta do @AnsiC . O enunciado está confuso sobre o que realmente quer, vou deixar do jeito que esta. Quando terminar todas as listas volto nos que não consegui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jessé P. de Melo observe como raciocinei acima no poster #21, quem sabe lhe ajuda da próxima vez.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×