Pesquisar este blog

Livros Recomendados

quarta-feira, 3 de março de 2021

URI (BEECROWD) - 2129 - Fatorial - Matemática - C e C++

Agora um problema da categoria Matemática! O problema em questão é o "Fatorial", veja na sequência do post.

Plataforma: URI (BEECROWD)

Problema2129

Enunciado:

Joãozinho é um garoto esperto da sexta série. Ele gosta muito de matemática, e descobriu que sua professora é muito preguiçosa. Nas provas da matéria a professora pede que as crianças circulem a resposta com um quadrado colorido, e que façam o primeiro dígito diferente de zero (da direita para esquerda) do número especialmente grande com caneta. Joãozinho desconfiou que a professora olhava apenas para aquele dígito para corrigir a questão.

A turma aprendeu a calcular o fatorial de um número, e isso será cobrado na próxima prova. Joãozinho está convencido de que não precisa escrever de fato o número correto, desde que o primeiro dígito (olhando da direita para esquerda) seja o correto. Sua tarefa neste problema é ajudar Joãozinho a calcular para um número inteiro n da entrada, o primeiro dígito (da direita para esquerda) de n! que seja diferente de zero.


Linguagens: C e C++


Solução:

A ideia foi criar um array com as possibilidades de dígitos e verificar o último dígito diferente de zero, o que fiz com uma função. Se o valor fosse menor que 10, retornava o próprio n-ésimo elemento do array. Se fosse par, retornaria um cálculo multiplicado por 6, se fosse ímpar, multiplicado por 4. A verdade é que grande parte do cálculo será realizada em qualquer um dos dois casos, então poderia ter utilizado uma variável para guardar este valor. Fica a seu critério como deseja fazer!

Código em C:

#include <stdio.h>

int dig[] = {1, 1, 2, 6, 4, 2, 2, 4, 2, 8}; 
  
int lastNon0Digit(int n) { 
    
    if (n < 10) 
        return dig[n]; 
        
    if (((n/10)%10)%2 == 0) 
        return (6 * lastNon0Digit(n / 5) * dig[n % 10]) % 10; 
    
    else
        return (4 * lastNon0Digit(n / 5) * dig[n % 10]) % 10; 
} 

int main()  {
    int n, fatorial, contador = 1;
    long int resultado;
    while (scanf("%i", &n) != EOF) {
        
        fatorial = n;
        resultado = 1;
    
        printf("Instancia %i\n", contador++);
        
        printf("%i\n\n", lastNon0Digit(n));
        
    }
    return 0;
}

Código em C++:

#include <iostream>

using namespace std;

int lastNon0Digit(int n) { 

    int dig[] = {1, 1, 2, 6, 4, 2, 2, 4, 2, 8};
    
    if (n < 10) 
        return dig[n]; 
        
    if (((n / 10) % 10) % 2 == 0) 
        return (6 * lastNon0Digit(n / 5) * dig[n % 10]) % 10; 
    
    else
        return (4 * lastNon0Digit(n / 5) * dig[n % 10]) % 10; 
} 

int main()  {
    
    int n, fatorial, contador = 1;
    long int resultado;
    
    while (cin >> n) {
        
        fatorial = n;
        resultado = 1;
    
        cout << "Instancia " << contador++ << endl;
        cout << lastNon0Digit(n) << endl << endl;
        
    }
    return 0;
}

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas