Untitled
unknown
plain_text
7 months ago
6.8 kB
4
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