Agora um problema da categoria Matemática! O problema em questão é o "Fatorial", veja na sequência do post.
Plataforma: URI (BEECROWD)
Problema: 2129
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; }
#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