Solución a la Tarea 5: Producto circular

Había al menos dos formas de resolver esta tarea. Una era girando uno de los vectores para hacer el producto punto normal. Otra era utilizando las operaciones de residuo para girar virtualmente el segundo vector. Además, se podían calcular todos los productos por adelantado guardándolos en un vector para luego encontrar el máximo y el mínimo, o se podían ir calculando uno por uno y ajustando estos dos valores. Finalmente, el programa es más fácil de entender si se utilizan funciones. En el programa que muestro abajo, uso una función para leer un vector y una función para calcular el k-ésimo producto:

#include <stdio.h>

void lee(int n, int a[])
{
  int i;
 
  for (i = 0; i < n; i++)
    scanf("%d", &a[i]);
}
 
int producto(int n, int k, int a[], int b[])
{
  int i, p = 0;
 
  for (i = 0; i < n; i++)
    p += a[i]*b[(i + k) % n];
  return p;
}
 
int main(void)
{
  int i, n, p, max, min;
  int a[1000], b[1000];
 
  scanf("%d", &n);
  lee(n, a);
  lee(n, b);
  max = min = producto(n, 0, a, b);
  for (i = 1; i < n; i++) {
    p = producto(n, i, a, b);
    if (p < min)
      min = p;
    else if (p > max)
      max = p;
  }
  printf("%d %d\n", min, max);
  return 0;
}

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

Entrada                                      Salida
1 1 1                                        1 1
2 1 2 2 1                                    4 5
3 1 2 3 1 2 3                                11 14
4 3 1 4 1 2 7 1 8                            25 56
5 1 2 3 4 5 5 4 3 2 1                        35 50
6 1 -1 2 -2 3 -3 4 -4 5 -5 6 -6              -61 64
7 1 -2 3 -4 5 -6 7 -8 9 -10 11 -12 13 -14    -336 287
8 1 2 3 4 5 6 7 8 -1 -2 -3 -4 -5 -6 -7 -8    -204 -140
9 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1        0 0
10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1   10 10

Para probar su tarea en UNIX, escriban la instrucción gcc procirNN.c -o procir para compilar su programa, y la instrucción ./procir para correrlo. Algunos errores comúnes fueron: (a) Aunque no es necesariamente un error, lo mejor era usar funciones. (b) Al calcular el valor máximo, varios supusieron que lo menos que podría ser era cero, pero a veces puede ser negativo.