Autor Tema: Recursividad para suma de primos

0 Usuarios y 1 Visitante están viendo este tema.

29 Septiembre, 2012, 12:18 am
Leído 3164 veces

marsi

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 120
  • Karma: +0/-0
  • Sexo: Femenino
Holaa a todos, tengo un problema con algunos  ejercicios ojala pudieran ayudarme con alguno:
1) Calcular la suma de los enteros pares hasta n.
2) Determinar si un número entero positivo dado es una potencia de 2.
3) Calcular el número de combinaciones de m elementos tomados en n.
Para el primero lo que he hecho es:


#include <cstdlib>
#include <iostream>
#include<stdio.h>
int sumap(int n,int num)
{
   if(n==1)
     return 1;
   else
     {
      if(n%num==0)
        return num+sumap(n/num,num);
   
      else
        sumap(n,num+1);
      }
}
int main()
{
    int n,num;
    printf("Dar un numero entero no negativo\n");
    scanf("%d",&n);
    printf("La suma es:\n%d",sumap(n,2));
    system("PAUSE");
    return EXIT_SUCCESS;
}
pero lo que hace no es lo que quiero.

29 Septiembre, 2012, 01:10 am
Respuesta #1

pierrot

  • pabloN
  • Moderador Global
  • Mensajes: 3,447
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
El ejercicio no concuerda con el título de este hilo. ¿Por qué "suma de primos"?  ???

Para 1) entiendo que tienes que diseñar una función que calcule la suma de todos los números pares hasta un cierto natural \( n \) que te pasan como parámetro. ¿Tiene que ser recursivo, iterativo...? No sé cuál es el objetivo del ejercicio, pero lo más eficiente es calcularlo mediante una fórmula matemática. Te queda \( O(1) \).

Simplemente ten en cuenta que lo que piden es:

\( \displaystyle \sum_{i=1}^{\lfloor\frac{n}{2}\rfloor} 2i=2\lfloor\frac{n}{2}\rfloor\frac{(\lfloor\frac{n}{2}\rfloor+1)}{2}=\lfloor\frac{n}{2}\rfloor(\lfloor\frac{n}{2}\rfloor+1) \)

Por lo tanto no hay nada más eficiente que ésto:

#include<stdio.h>

int sumaParesHasta(int n){
// Precondicion: n es entero no negativo
   return (n/2)*(n/2+1);
}

int main(){
     int N;
     printf("Dar un numero entero no negativo:\n");
     scanf("%d",&N);
     printf("La suma pedida es:\n%d", sumaParesHasta(N));

     return 0;
}
$_="loe  hnachaPkr erttes,urJ";$j=0;for($i=0;s/(.)(.{$j})$//;$i++){$_=$2.$_,$j+=1-$i%2,print$1}print

22 Octubre, 2012, 07:02 pm
Respuesta #2

rockydm

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 5
  • Karma: +0/-0
  • Sexo: Masculino
Otra forma de resolver el primero:

//prec:inicio<=fin.
//en este caso inicio puede ser negativo

int sumap(int inicio,int fin)
{
   if(inicio==fin)
     return inicio;
   else
     {
      if(inicio%2==0)
        return inicio+sumap(inicio+1,fin);
   
      else
       reutrn  sumap(inicio+1,fin);
      }
}

26 Octubre, 2012, 06:05 am
Respuesta #3

Carolina Herschel

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 383
  • Karma: +0/-0
  • Sexo: Femenino
Hola

Para el 2) en C:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
   int n,k=0,m;
   
   printf("Introduzca un numero entero positivo: \n");
      scanf("%d",&n);
      m = n;
 
      while(m!=1){
      if(m%2!=0){
         printf("El numero no es potencia de 2\n");
         system("pause");   
          return 0;
      }
      m/=2;
      k++;
      }
      printf("El numero es potencia de 2 con exponente %d \n",k);
   system("pause");   
   return 0;
}
"Math is like love -- a simple idea but it can get complicated."