Untitled

 avatar
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