[ create a new paste ] login | about

Link: http://codepad.org/eO9N9Mw4    [ raw code | output | fork ]

C, pasted on Jun 13:
#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;
}


Output:
 1234567891011
1234567891011(deb)
-4041424344454647484912
-4041424343220079593901(deb)
 3972737475767778795013
-68686867452300798888(deb)
-387196979899100101805114
-387265666766552402604002(deb)
 377095112113114115102815215
376707846446347562700211213(deb)
-366994111120121116103825316
9713735326226446596385897(deb)
 356893110119118117104835417
366606845445344563701221314(deb)
-346792109108107106105845518
19814736337237457595375796(deb)
 3366919089888786855619
19818103256327346382231415(deb)
-3265646362616059585720
19814837609964730322645695(deb)
 3130292827262524232221
19817967902791992846877916(deb)
結果:19817967902791992846877916


Create a new paste based on this one


Comments: