Ronaldo, fiz aqui uma versaozinha em C otimizada, usando a fun��o phi(n) que diz o expoente de 2 na fatora��o em primos de n, e a fun��o f(n), que � a fun��o do problema (fiz f(n) = phi(1) + phi(2) + ... + phi(n)), e tb soma(n) = f(1) + f(2) + f(3) + ... + f(n). D� pra otimizar bem mais isso a�, mas j� � bem r�pido pra calcular soma(1023), ent�o n�o vi necessidade.

Abra�o,
bruno


int phi(int n) {
  if(n%2 == 1) return 0;
  return (phi(n/2) + 1);
}

int f(int n) {
  int i, s = 0;
  for (i = 1; i <= n; i++)
    s += phi(i);
  return soma;
}

int soma(int n) {
  int i, s = 0;
  for (i = 1; i <= n; i++)
    s += f(i);
  return s;
}

int main() {
  int n = 1;
  while(n) {
    printf("digite n (0 para sair): ");
    scanf("%d",&n);
    printf("soma(n)=%d\n\n", soma(n));
  }
}

On 5/22/05, Ronaldo Luiz Alonso <[EMAIL PROTECTED] > 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

Responder a