Code en C :
#include <stdio.h>
#include <stdlib.h>
void usage(char *s)
{
fprintf(stderr, "Usage: %s <n>\n", s);
exit(EXIT_FAILURE);
}
int main(int argc, char** argv)
{
/* On veut deux arguments */
if (argc != 2) {
usage(argv[0]);
}
/* Convertit l'argument en un entier */
char *p;
int n = strtol(argv[1], &p, 10);
if (*p != '\0') {
fprintf(stderr, "Erreur: l'argument doit être un entier!\n");
usage(argv[0]);
}
int t[n][n];
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
t[i][j] = 0;
}
}
int x = n/2;
int y = 0;
for (int i=1; i <= n*n; i++) {
t[y][x] = i;
if (i == n*n) {
break;
}
x = (x+1) % n;
y = (y+n-1) % n;
if (t[y][x] != 0) {
x = (x+n-1) % n;
y = (y+2) % n;
}
}
/* Affichage */
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
printf("%4d ", t[i][j]);
}
printf("\n");
}
/* Vérification, lignes */
int s = 0, s2 = 0;
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
s2 += t[i][j];
}
if (s == 0) {
s = s2;
}
if (s2 != s) {
printf("Le carré n'est pas un carré magique !\n");
exit(EXIT_FAILURE);
}
s2 = 0;
}
/* Vérification, colonnes */
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
s2 += t[j][i];
}
if (s2 != s) {
printf("Le carré n'est pas un carré magique !\n");
exit(EXIT_FAILURE);
}
s2 = 0;
}
/* Vérification, diagonales */
for (int i=0; i<n; i++) {
s2 += t[i][i];
}
if (s2 != s) {
printf("Le carré n'est pas un carré magique !\n");
exit(EXIT_FAILURE);
}
s2 = 0;
for (int i=0; i<n; i++) {
s2 += t[i][n-i-1];
}
if (s2 != s) {
printf("Le carré n'est pas un carré magique !\n");
exit(EXIT_FAILURE);
}
printf("Le carré est un carré magique. La somme est %d.\n", s);
}
Chez moi ça fonctione jusqu'à n = 1447. Après ça fait un segfault, sans doute à cause d'un stack overflow...