As I do not know the exact syntax of portugol / visualg, please kindly correct any slip
This is a problem whose answer needs to address a decision issue and also needs to answer the formatting of a response.
What is a decision issue?
A decision issue is a problem for which sim
or não
must be answered. Examples of decision problem:
Note that it is not always possible to get the affirmative or negative answer, but this is another conversation for another day.
Issue decision problem
The question asks whether given number is divisible by 8 if it is divisible by 5 and by 2; ask this individually, then for 200, I need to answer yes three times.
Each of these questions is an instance of a larger problem: X
is divisible by Y
?
To answer the general question, the code is:
X % Y = 0
Then, for each of the questions, replace Y
with the appropriate value:
X % 8 = 0
X % 5 = 0
X % 2 = 0
Formatting the response
The format of the response is:
X é divisível por N( e por K)*
Where X
is the number entered, N
is the first divisor, and the part in parentheses is repeated for each K
also divisor of X
.
In order to identify if we have already detected divisors of our search universe (8, 5, and 2, in that order), I will use a variable called divisores_encontrados
, which will save the value of how many divisors the algorithm found until that moment . This means that it starts with zero, and if any of the checks returns that the number is divisor, increase the value of divisores_encontrados
.
Note: Consider everything after #
as comment
var entrada, divisores_encontrados, divisor_teste: inteiro
início
divisores_encontrados <- 0 # inicializando o valor; ainda não foi encontrado nada
leia(entrada)
divisor_teste <- 8
se entrada % divisor_teste = 0 então
se divisores_encontrados = 0 # primeira vez que encontrou um divisor
escreva(entrada)
escreva(" é divisível por ")
escreva(divisor_teste)
senão
escreva(" e por ")
escreva(divisor_teste)
fimse # verificação do primeiro divisor encontrado
divisores_encontrados <- divisores_encontrados + 1
fimse # verificação da divisibilidade
divisor_teste <- 5
se entrada % divisor_teste = 0 então
se divisores_encontrados = 0 # primeira vez que encontrou um divisor
escreva(entrada)
escreva(" é divisível por ")
escreva(divisor_teste)
senão
escreva(" e por ")
escreva(divisor_teste)
fimse # verificação do primeiro divisor encontrado
divisores_encontrados <- divisores_encontrados + 1
fimse # verificação da divisibilidade
divisor_teste <- 2
se entrada % divisor_teste = 0 então
se divisores_encontrados = 0 # primeira vez que encontrou um divisor
escreva(entrada)
escreva(" é divisível por ")
escreva(divisor_teste)
senão
escreva(" e por ")
escreva(divisor_teste)
fimse # verificação do primeiro divisor encontrado
divisores_encontrados <- divisores_encontrados + 1
fimse # verificação da divisibilidade
se divisores_encontrados = 0
escreva(entrada)
escreva(" não é divisível por 2, 5 e nem 8")
fimse # caso sem divisibilidade por 2, 5, 8
escreval("") # só para pular linha no fim ;-)
fimalgoritmo
Bonus: About the amount of dividers
Your question program calculates how many divisors a number has. He writes each step of the loop which number is being tested, but without breaking the line.
You can simply not write these intermediate numbers if they do not interest you.
To know how many divisors have a number, we also do not need to go through all numbers smaller than the number reported; there are decomposition strategies in prime numbers and also another one that allows you to count up to the square root of the number. I'll go into more detail on the latter.
Every number X % Y = 0
means that there is F
integer such that F * Y = X
. For any number other than the perfect square root of X
, finding Y
means knowing the existence of its F
brother factor. If I assume that Y
is less than F
, then I only need to count how many Y
s there is in the [1, raiz(X))
interval (I left the interval open in the square root, then I explain why) and multiply by 2. In the case of the square root, if the number found is a perfect square, the pair of raiz(X)
will be F = raiz(X)
, so that particular number can only enter once.
The case of the number 1
and X
are trivial divisors, so I will not even go through them in the loop
var divisores_encontrados, r, entrada, divisor_teste: inteiro
início
leia(entrada)
se entrada = 1 # único caso que existem menos de dois divisores
divisores_encontrados = 1
senão
divisores_encontrados <- 2 # os dois triviais
r <- arredonda_baixo(raiz(entrada))
divisor_teste <- 2
enquanto divisor_teste < r # não pode ser <= porque o intervalo é aberto na raiz
se entrada % divisor_teste = 0
divisores_encontrados <- divisores_encontrados + 2 # lembrando que achamos divisor_teste e sabemos que ele tem um par F maior do que a raiz quadrada
fimse
divisor_teste <- divisor_teste + 1
fimenquanto
se entrada % r = 0
divisores_encontrados <- divisores_encontrados + 1 # entrada é quadrado perfeito
fimse
fimse
escreva(entrada)
escreva(" possui ")
escreva(divisores_encontrados)
escreval(" divisores")
fimalgoritmo