[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [obm-l] Re: [obm-l] potência de 2
Claro, claro...
Este e um problema meio bracal, mas nao tento (e
possivel programar computadores de um modo mais
esperto, acredite!).
Bem, ha uma formula que diz quale a maior potencia de
2 que divide n!.
Veja um caso particular pequeno: n = 16
0[2^0=1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1[2^1=2] 2 4 6 8 10 12 14 16
2[2^2=4] 4 8 12 16
3[2^3=8] 8 16
4[2^4=16] 16
Pergunta: O que e essa tabela?
Resposta: Ela te diz: na linha onde esta marcado o
numero n, o valor entre colchetes diz quais os numeros
tem este valor como multiplo.
Veja que cada linha contem, em media, metade da
anterior.
Ta lancada a dica.
Bem, a somatoria das f's e algo mais chato...
<ronaldo.luiz.alonso@bol.com.br> escreveu:
> >Sabendo que f(n) é maior potência de 2 que
> divide n! ,
> >determine o valor de
> >f(1) + f(2) +...+ f(1023) .
>
> Vejamos mais de perto:
>
> 1! = 1 a maior potência de 2 que divide 1! é 0 (2^0
> = 1).
> 2! = 2 a maior potência de 2 que divide 2! é 1 (2^1
> = 2).
> 3! = 6=3.2.1 a maior potência de 2 que divide 3! é
> 1 (2^1 = 2).
> 4! = 24 = 4.3.2.1 a maior potência de 2 que divide
> 4! é 3 (2^3 = 8).
> ...
> Pelos exemplos acima parece que não há uma regra
> geral.
>
> Note que com 5! por exemplo, a maior potência de 2
> que divide 5!
> continua sendo 3 (porque 5 é primo).
>
> Mas no caso de 6 (que não é primo)
> a maior potência de 2 que divide 6! será 4.
>
> Peço desculpas a quem não sabe C,
> mas eu faria um programa
> de computador para calcular a soma (pois o
> computador atrofiou meu cérebro)
> e desafio alguém a pensar em algo mais "força bruta"
> e feio que isso:
>
> /* calcula a soma f(1) + f(2) + ...+ f(x) */
> unsigned int soma_pot2_fatorial( unsigned int x)
> { int i;
> soma =0
> for (i = 1; i <= x; i++)
> {
> int k = fatorial (i); /* calcula o fatorial
> de i -- note que k é
> uma variável de escopo local */
> while (( k % 2) == 0){ /* enquanto o resto
> da divisão por 2 for
> zero */
> soma = soma++; /* incrementa soma */
> k = k/2; /* k recebe a parte inteira da
> divisão de k por 2 */
> }// fim enquanto
> }// volta ao laço com o valor de i
> incrementado.
> return soma;
> }
>
> Acho que não isso não ajuda, mas
> pelo menos calcula a soma pedida ...
>
> []s Ronaldo L. Alonso
>
>
=========================================================================
> Instruções para entrar na lista, sair da lista e
> usar a lista em
> http://www.mat.puc-rio.br/~nicolau/olimp/obm-l.html
>
=========================================================================
>
__________________________________________________
Converse com seus amigos em tempo real com o Yahoo! Messenger
http://br.download.yahoo.com/messenger/
=========================================================================
Instruções para entrar na lista, sair da lista e usar a lista em
http://www.mat.puc-rio.br/~nicolau/olimp/obm-l.html
=========================================================================