#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
void impares( int ); //funciones
void pares( int );
void main( )
{
int n; //Altura del lado
cout<<"Introduce el lado del cuadrado magico: "; //Pide q introduzcas la altura del lado
cin>>n; //Lee el dato introducido n
if (n < 1 || n == 2) //No puede existir un cuadrado magico de menos de 1 fila de altura
{ //ni de 2 ya que no cumplen el patron general de creacion de
// cuadrados magicos
printf( "Entrada no valida\n" ); //Por lo tanto compara n y si se da alguno de los casos anteriores
getchar(); // imprime por pantalla "entrada no valida"
}
if ((n%2==1)) //Existen 2 metodos de creacion de cuadrados magicos dependiendo de que
impares(n); //la altura del cuadrado sea par o impar. Aqui se compara el dato n
else //para determinar si es par o impar y asi aplicar el metodo correpondiente.
pares(n);
printf( "\n\nLa suma de cada fila y columna es %8d\n\n", n*(n*n+1) >> 1 );
getchar(); //Por ultimo se imprime por pantalla el resultado de la suma.
}
//Metodo impares
void impares( int N )
{
int i, j, N1, N3, t;
N1 = (N-1)>>1;
N3 = N1-1;
for (i=1; i <= N; i++) // Cada una de las filas
{
for (j=1; j <=N; j++) //Cada una de las columnas
{
t = N1-i+j;
if (t >= N)
{
t -= N;
}
else if (t < 0)
{
t += N;
}
printf( "%5d ", 1 + t + N * ((N3+i+j)%N) );// Calculo matematico
}
printf( "\n" ); //Salto de fila
}
}
// Metodo pares
void pares( int n )
{
int i, j, num = 1;
int n1 = n-1, nn = n*n+1;
int bloque1 = (n-2)>>2, bloque2 = n1 - bloque1;
int dentro1 = n>>2, dentro2 = n1 - dentro1; // >> actua sobre la estructura de bits del dato.
for (j=0; j < n; j++) // Cada una de las filas
{
for (i=0; i < n; i++) //Cada una de las columnas
{
if (i >= dentro1 && i <= dentro2 && j >= dentro1 && j <= dentro2)
{
printf( "%5d ", num );
}
else if ((i > bloque1 && i < bloque2) || (j > bloque1 && j < bloque2))
{
printf( "%5d ", nn - num );
}
else
{
printf( "%5d ", num );
}
num++; // Calculo matematico
}
printf( "\n" ); // Salto de linea
}
}