#include <stdio.h>
int * tbl;
//文字の並びをひっくり返す
void reverse(char * p)
{
int i, j;
char c;
for(i = 0, j = strlen(p) - 1 ; j >= i ; i++, j--)
{
c = p[j];
p[j] = p[i];
p[i] = c;
}
}
//絶対値でp1が大きいなら1,p2が大きいなら-1,同じなら0を返す
int absbigger(char * p1, char * p2)
{
int len1, len2;
if(*p1 == '-') p1++;
if(*p2 == '-') p2++;
len1 = strlen(p1);
len2 = strlen(p2);
if(len1 == len2)
{
while(*p1)
{
if(*p1 == *p2)
{
p1++;
p2++;
}
else
{
if(*p1 > *p2) return 1;
else return -1;
}
}
return 0;
}
else if(len1 > len2) return 1;
else return -1;
}
void myaddsub(int sign, char * kekka, char * operand1, char * operand2)
{
char * p1, * p2, * p3;
int len1, len2, v1, v2, v3, carry;
int sign1, sign2;
int opsign, lastsign;
// 絶対値の大きい方をp2にする
int a;
if((a = absbigger(operand1, operand2)) > 0)
{
p2 = operand1;
p1 = operand2;
sign2 = (p2[0] == '-' ? -1 : 1);
sign1 = (p1[0] == '-' ? -1 : 1) * sign;
}
else if(a == 0)
{
*kekka = '\0';
return;
}
else
{
p1 = operand1;
p2 = operand2;
sign1 = (p1[0] == '-' ? -1 : 1);
sign2 = (p2[0] == '-' ? -1 : 1) * sign;
}
// 最終的な負号は絶対値の大きい方
lastsign = sign2;
// 足し算でいく?それとも引き算?
opsign = sign1 * sign2;
// 諸事情によりひっくり返しておく
reverse(operand1);
reverse(operand2);
// p2とp1を足し算または引き算
p3 = kekka;
carry = 0;
while(1)
{
if((*p2 >= '0') && (*p2 <= '9'))
{
v2 = *p2 - '0';
p2++;
}
else break;
if((*p1 >= '0') && (*p1 <= '9'))
{
v1 = *p1 - '0';
p1++;
}
else v1 = 0;
v3 = v2 + opsign * v1 + carry;
if(v3 < 0)
{
carry = -1;
v3 += 10;
}
else if(v3 > 9)
{
carry = 1;
v3 -= 10;
}
else
carry = 0;
*p3 = (v3 % 10) + '0';
p3++;
}
if(carry == 1) *p3++ = '1';
// 無駄なゼロをとっぱらう
while((p3 > kekka) && *(p3 - 1) == '0') p3--;
if(lastsign < 0) *p3++ = '-';
*p3 = '\0';
reverse(kekka);
}
void f(int n)
{
int i, j;
char operand1[20000];
char operand2[20000];
char kekka[20000];
int sign;
char * p;
kekka[0] = '\0';
for(j = 0 ; j < n ; j++)
{
p = operand2;
for(i = 0 ; i < n ; i++)
{
p += sprintf(p, "%d", *(tbl + i + j * n));
}
sign = (j % 2 ? -1 : 1); // 負号を決定
printf("%c%s\n", (sign == -1 ? '-' : ' '), operand2); // debug
strcpy(operand1, kekka); // 第一引数はいままでの結果にする
myaddsub(sign, kekka, operand1, operand2);
printf("%s(deb)\n", kekka); // debug
}
printf("結果:%s\n", kekka);
}
void uzumaki(int n, int * tbl, int count, int c1, int r1, int c2, int r2)
{
int i, j;
for(j = r1, i = c1 ; i <= c2 ; i++) *(tbl + i + n * j) = count++;
for(i--, j = r1 + 1 ; j <= r2 ; j++) *(tbl + i + n * j) = count++;
for(j--, i = c2 - 1 ; i >= c1 ; i--) *(tbl + i + n * j) = count++;
for(i++, j = r2 - 1 ; j > r1 ; j--) *(tbl + i + n * j) = count++;
if(((c2 - c1) <= 1) || ((r2 - r1) <= 1)) return;
uzumaki(n, tbl, count, c1 + 1, r1 + 1, c2 - 1, r2 - 1);
}
#define N 11
int main(int argc, char ** argv)
{
tbl = (int *)malloc(sizeof(int) * N * N);
uzumaki(N, tbl, 1, 0, 0, N - 1, N - 1);
f(N);
free(tbl);
return 0;
}