Programa que devuelve la suma de todos los divisores de un número excepto n

Iniciado por ERIK546, 29 Junio 2012, 04:01 AM

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

ERIK546

Hola, esta semana he estado haciendo muchos programas y ocupo mucho de la ayuda de esta excelente comunidad; esta vez ocupo hacer una función en un programa(es importante que sea una función) que lo que haga es sumar todos los divisores de un número n, sin incluir al número n en la sumatoria. He desarrollado la función, pero lamentablemente me marca error en la condición de un "if" que se encuentra en la función. Espero que me puedan orientar para arreglar este problema y me dijeran ¿Porqué no se puede hacer lo que intento? ya que considero que no hay errores de sintaxis, y al menos para mí tiene lógica lo que se pretende. Gracias de antemano; les dejo el código:

#include <stdio.h>
#include <stdlib.h>
int suma(int n);
int main(int argc, char *argv[])
{
    int n;
   
    printf("Programa que devuelve la suma de todos los divisores de un numero n, sin incluirlo\n");
    printf("Introduce el numero\n");
    scanf("%d",&n);
    printf("El resuldado es: %d\n",suma(n));
   
    system("PAUSE");
    return 0;

   int suma(int n){
       int i;
       int c;
       int *d;
       for(i=1;i<n;i++){
                        if(n%i=0){
                                   d[i]=i;
                                   }
                        }
       c=0;
       for(i=1;i<n;i++){
                        c+=d[i];
                        }
       return c;
       }

do-while

¡Buenas!

El error de tu codigo es que declaras d como un puntero a entero.

Estas intentando utilizarlo como un vector, pero es un puntero que en principio apunta a cualquier parte de la memoria, por lo que estaras intentando escribir en alguna parte del programa en la que no tengas permiso para escribir, o estaras sobreescribiendo otros datos de tu programa.

Una solucion podria ser asignar dinamicamente una dimension para esta variable. No te lo aconsejo, porque en principio no sabes cuantos divisores va a tener tu numero, por lo que podria tener mayor cantidad de divisores que la dimension que le indiques.

Otra solucion seria ir aumentando la memoria cada vez que encuentres un divisor. Un coñazo y hay formas mas sencillas de resolverlo.

Mas alternativas... En lugar de utilizar punteros, declara un vector estatico con una dimension. (Volvemos al problema de dos parrafos mas arriba)

La mejor solucion, olvidate de los vectores y los punteros para este problema. No te hacen falta para nada. Si encuentras un divisor, lo acumulas en una variable y punto. Sencillo y rapido. (Esta era la solucion buena. XD)

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

ERIK546

Cita de: do-while en 29 Junio 2012, 04:52 AM
¡Buenas!

El error de tu codigo es que declaras d como un puntero a entero.

Estas intentando utilizarlo como un vector, pero es un puntero que en principio apunta a cualquier parte de la memoria, por lo que estaras intentando escribir en alguna parte del programa en la que no tengas permiso para escribir, o estaras sobreescribiendo otros datos de tu programa.

Una solucion podria ser asignar dinamicamente una dimension para esta variable. No te lo aconsejo, porque en principio no sabes cuantos divisores va a tener tu numero, por lo que podria tener mayor cantidad de divisores que la dimension que le indiques.

Otra solucion seria ir aumentando la memoria cada vez que encuentres un divisor. Un coñazo y hay formas mas sencillas de resolverlo.

Mas alternativas... En lugar de utilizar punteros, declara un vector estatico con una dimension. (Volvemos al problema de dos parrafos mas arriba)

La mejor solucion, olvidate de los vectores y los punteros para este problema. No te hacen falta para nada. Si encuentras un divisor, lo acumulas en una variable y punto. Sencillo y rapido. (Esta era la solucion buena. XD)

¡Saludos!
Muchas gracias do-while no lo había visto de esa forma, ahora ya lo he resuelto y corre a la perfección, dejo el código:

#include <stdio.h>
#include <stdlib.h>
int suma(int n);
int main(int argc, char *argv[])
{
    int n;
   
    printf("Programa que devuelve la suma de todos los divisores de un numero n, sin incluirlo\n");
    printf("Introduce el numero\n");
    scanf("%d",&n);
    printf("El resuldado es: %d\n",suma(n));
   
    system("PAUSE");
    return 0;

   int suma(int n){
       int i;
       int d;
       int c;
       c=0;
       for(i=1;i<n;i++){
                        if(n%i==0){
                                   d=i;
                                   c+=d;
                                   }
                        }
                        return c;
       }