Untitled
unknown
plain_text
19 days ago
6.8 kB
3
Indexable
#include <stdio.h> #include <string.h> //importa a biblioteca para usar a funcao strlen // funcao para multiplicar um numero representado como uma (string) por um único digito e o resultado da multiplicacao e armazenado de volta na string resultado void multiplicar(char resultado[], int digito) // [] e um array , e tipo uma lista \0 { int tamanho = strlen(resultado); // a funcao strlen calcula o comprimento de uma string int transporte = 0; // inicia a variavel transporte com 0 e a funcao transporte armazena o excesso que precisa ser levado para o proximo digito durante a multiplicacao. for (int i = tamanho - 1; i >= 0; i--) // este loop percorre a string de tras para a frente (do ultimo pro primeiro), a multiplicacao manual e feita da direita para a esquerda logo o loop segue essa logica { int valor = (resultado[i] - '0') * digito + transporte; // isto (resultado[i] - '0') vai converter um char para int e depois no resto da linha vou multiplicar o digito atual pelo digito fornecido e soma o transporte, o excesso da multiplicacao anterior resultado[i] = (valor % 10) + '0'; // isto (valor % 10) e para obter o digito das unidade de valor e o " + '0' " e para converter para char denovo e armazena na posicao i da string resultado transporte = valor / 10; // vai calcular o transporte para a procima multiplicacao , que o que vai ser levado para o proximo por exemplo 37 : (37 % 10) = 7 e 37 / 10 = 3 e o que vai ser levado e o 3 ,o 3 e um digito mais significativo } while (transporte > 0) // este loop vai contimnuar enquanto houber transporte restante { int deslocaNum = strlen(resultado); // calcula o comprimento atual da string resultado // vai mover todos os caracteres para a direita para fazer espaco for (int i = deslocaNum; i >= 0; i--) // vai percorrer a string de tras para a frente { resultado[i + 1] = resultado[i]; // move cada caracter uma posicao para a direita } // e este loop for vai fazer espaco no inicio da string para adicionar o novo digito de transporte // vai meter o novo digito no inicio resultado[0] = (transporte % 10) + '0'; // com isto (transporte % 10) vai obter o digito das unidades do transoporte e com o " + '0' " vai cornverter o digito para char e vai armazenar o digito no inicio da string (resultado[0]) e e importante porque adiciona o digito do transporte ao inicio da string transporte = transporte / 10;// calcula o novo transporte ao dividir por 10 por fazer isso atualiza o transporte para processar o proximo digito caso tiver transporte } } int comparar(char num1[], char num2[]) // funcao para comparar duas strings de numero e o com maior comprimento e maior { int tamanho1 = strlen(num1); // calcula o comprimento de uma string num1 int tamanho2 = strlen(num2);// calcula o comprimento de uma string num2 if (tamanho1 > tamanho2) // se o num1 for maior que o num2 da return a 1 return 1; if (tamanho1 < tamanho2)// se o num2 for maior que o num1 da return a -1 return -1; // se os numeros tiverem o mesmo tamanho for (int i = 0; i < tamanho1; i++) // este loop percorre os digitos das strings da esquerda para a direira { if (num1[i] > num2[i]) // de acordo com o loop num1 e num2 se tiverem o mesmo tamanho o que tiver o primeiro digito mais alto e o maior e depois da return 1 pois num1 maior que num2 return 1; if (num1[i] < num2[i])// de acordo com o loop num1 e num2 se tiverem o mesmo tamanho o que tiver o primeiro digito mais alto e o maior e depois da return -1 pois num2 maior que num1 return -1; } return 0; // retorna zero se todos os digitos forem iguais } // funcao para encontrar o maior produto de knumeros digitos consecutivos void maiorProduto(char numero[], int knumero, char resultado[]) // esta funcao encontra o maior produto de knumero digitios conecutivos na string de numeros numeros e o maior fica armazenado resultado { strcpy(resultado, "0"); // vai copiar o "0" para a string resultado, o que garante que qualquer produto calculado sera maior que 0 valor inicial int tamanho = strlen(numero); // vai calcular o tamanho da string numero for (int i = 0; i <= tamanho - knumero; i++)// este loop percorre todas as possiveis sequencias de knumero digitos na string numero { int temZero = 0; // um booleano a funcao temZero vai comecar com falso, nao tem zeros for (int j = 0; j < knumero && !temZero; j++) // percorre os digitos da sequencia atual !temzero -> negacao de temzero { if (numero[i + j] == '0') // ta a ver se o digito e zero { temZero = 1; // tem zero , true e e importante porque ignora sequencias que contem zeros } } if (!temZero) //! temzero -> negacao de temzero se nao tiver zeros { char produto[1000] = "1"; // Comeca com identidade multiplicativa (elemento neutro da multiplicacao) // vai calcular o produto da sequencia atual for (int j = 0; j < knumero; j++) { int digitoAtual = numero[i + j] - '0'; // converte a char para int multiplicar(produto, digitoAtual); // vai multiplicar o produto (string) pelo digitoAtual } // vai atualizar o resultado se o produto atual for maior if (comparar(produto, resultado) > 0) { strcpy(resultado, produto); // copia a string produto para o array resultado para que comece com um valor minimo } } } } int main() { int casos; if (scanf("%d", &casos) != 1) // se ler mais do que um input ou menos do que 1 input encerra logo { return 1; }; char resultados[casos][1000]; // vai armazenar todos resultados de todos os casos de teste for (int i = 0; i < casos; i++) //enquanto o i for menor que o numero de casos { char numero[1001]; int knumero; if (scanf("%s %d", numero, &knumero) != 2) // vai sler a string de numeros e o valor knumero de cada teste e se o input for diferente de 2 vai encerrar o programa { return 1; } maiorProduto(numero, knumero, resultados[i]);//caso estaja tudo certo vai fazer o maior produto e guardar em resultados[i] } for (int i = 0; i < casos; i++) // enquanto i for menor que o numero de casos { printf("%s\n", resultados[i]); // vai dar print dos resultados de todos os casos de teste } return 0; }
Editor is loading...
Leave a Comment