[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [obm-l] Re: [obm-l] potência de 2



Oi, Ronaldo. Alguns comentarios:
soma = soma++;
não pode em C.
Tudo bem, pode. Tudo bem, vai compilar. Mas não está definido pela linguagem. Como não está definido, o comportamento pode não ser o esperado. Digamos n = 3;
n = n++;
Tem compilador que após essa linha faz n = 3, tem compilador que faz n=4, tem compilador que faz n=7... mas não quer dizer que n não possa ter qualquer outro valor. É completamente indefinido.

Outra coisa: vc fez int k = fatorial(i);
Seja lá como estiver definida a função fatorial, ela deve retornar int, ou então haverá um cast implicito aí. Nos pcs "normais", um int tem 32 bits. Ou seja: se n>13, n! > INT_MAX, logo o resultado de 14! será errado.
Tudo bem, suponhamos que no seu pc/os o int tenha 64 bits. Então se n>21, n! já não cabe mais no int de 32 bits.

precisamos de outra solução...

:)

abraço
bruno

On 5/22/05, Ronaldo Luiz Alonso <ronaldo.luiz.alonso@bol.com.br> wrote:
>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
=========================================================================



--
Bruno França dos Reis
email: bfreis - gmail.com
gpg-key: http://planeta.terra.com.br/informatica/brunoreis/brunoreis.key
icq: 12626000

e^(pi*i)+1=0