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.