Solución a la Tarea 4: Centro de un Vector

Esta tarea se puede resolver en dos etapas: Primero leemos los datos y luego calculamos el centro. Para lo primero podemos usar la función:

void lee(int *n, long int x[])
{
  int i;
                                                                               
  scanf("%d", n);
  for (i = 0; i <= *n; i++)
    scanf("%ld", &x[i]);
}

Para calcular el centro también podemos usar una función. Observe que ésta trabaja probando cada uno de los valores de c hasta que encuentra uno que satisface las condiciones del problema. ¿Porqué sólo probamos valores de c desde 1 hasta n-1? Las variables izq y der acumulan los términos de las sumas izquierda y derecha. ¿Porqué incluimos el término i = c en ambas sumas? Si estas sumas son iguales, el parámetro *s se modifica para que valga el valor de la suma común y se regresa el valor correspondiente de c. Si las sumas nunca son iguales, entonces *s queda con valor 0 y se regresa un -1. Note que, como esta función calcula dos valores, al menos uno debía ser un parámetro por referencia. Note también que izq y der deben ser long int, pues pueden tomar valores muy grandes. ¿Qué tan grandes?

int centro(int n, long int x[], long int *s)
{
  int c, i;
  long int izq, der;
                                                                               
  *s = 0;
  for (c = 1; c < n; c++) {
    izq = der = 0;
    for (i = 0; i <= c; i++)
      izq += (c - i)*x[i];
    for (i = c; i <= n; i++)
      der += (i - c)*x[i];
    if (izq == der) {
      *s = izq;
      return c;
    }
  }
  return -1;
}

Finalmente, el programa principal simplemente usa las dos funciones anteriores:

int main(void)
{
  int c, n;
  long int s, x[1001];
                                                                               
  lee(&n, x);
  c = centro(n, x, &s);
  printf("%d %ld\n", c, s);
  return 0;
}

Los valores de entrada y salida empleados para la evaluación fueron los siguientes:

Entrada                    Salida
1 1 1                      -1 0
2 1 1 1                    1 1
3 1 2 1 1                  -1 0
4 6 2 3 0 1                1 6
5 2 3 4 7 6 5              3 16
6 3 1 4 1 5 8 8            4 24
7 2 7 1 8 2 7 4 8          4 39
8 1 2 3 5 3 1 1 2 3        4 21
9 4 5 2 3 1 5 6 8 9 1      5 53
10 3 1 6 2 2 7 7 6 6 6 7   6 64

Para probar su tarea en UNIX, escriban la instrucción gcc centroNN.c -o centro para compilar su programa, y la instrucción ./centro para correrlo.  En este caso, cada prueba vale dos puntos: uno para c y otro para s. Algunos errores comúnes fueron: (a) No leer las n+1 componentes del vector. (b) No probar todos los valores de c entre 1 y n-1. (c) No calcular las sumas correctamente. (d) No usar números de tipo long int (aunque no probé con números muy grandes).