⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iadd.c

📁 Arithmetic for integers of almost unlimited size for C and C++. Developed and copyrighted by Ra
💻 C
字号:
/* Integer Version 2.0, RD, 20.1.93	iadd.c	*/#include <iint.h>#include <idigit.h>#include <imem.h>void IplasI(a, b)    register pInteger a;    register const Integer *b;/* a+=b; */{    if (a->sign == b->sign)    {	register int neededlength = a->length;	if (neededlength < b->length)	{	    neededlength = b->length;	}	neededlength++;	if (neededlength > a->maxlength)	{	    register DigitType *newv;	    register int oldlength = a->maxlength;	    a->maxlength = neededlength;	    newv = newDigitVec(&a->maxlength);	    a->length =		DigitVecCadd(newv, a->vec, b->vec, a->length, b->length);	    delDigitVec(a->vec, oldlength);	    a->vec = newv;	    return;	}	else	{	    a->length =		DigitVecCadd(a->vec, a->vec, b->vec, a->length, b->length);	    return;	}    }    else    {	/*	   Vorzeichen verschieden, subtrahiere betragsmaessig kleineres von	   groesserem	*/	if ((b->length > a->length) || ((b->length == a->length)				  && DigitVecGt(b->vec, a->vec, a->length)))	{	    /* |b|>|a| */	    register int neededlength = b->length;	    if (neededlength <= a->maxlength)	    {		a->length = DigitVecCsub(a->vec, b->vec, a->vec,					 b->length, a->length);		a->sign = b->sign;		return;	    }	    else	    {		register DigitType *newv;		register int oldlength = a->maxlength;		a->maxlength = neededlength;		newv = newDigitVec(&a->maxlength);		a->length = DigitVecCsub(newv, b->vec, a->vec,					 b->length, a->length);		delDigitVec(a->vec, oldlength);		a->vec = newv;		a->sign = b->sign;		return;	    }	}	else	{	    /* |b| <= |a| */	    register int l = a->length;	    register DigitType *lp = &(a->vec[l - 1]);	    DigitVecCsubto(a->vec, b->vec, b->length);	    while ((l > 0) && (!*lp))	    {		l--;		lp--;	    }	    a->length = l;	    if (!l)		a->sign = PLUS;	    return;	}    }}				/* IplasI */void IasIplI(sum, a, b)    register pInteger sum;    register const Integer *a, *b;/* sum=a+b; */{    register int neededlength;    if (sum == a)    {	IplasI(sum, b);	return;    }    if (sum == b)    {	IplasI(sum, a);	return;    }    if (a->sign == b->sign)    {				/* Addition */	neededlength = a->length;	if (neededlength < b->length)	    neededlength = b->length;	neededlength++;	if (neededlength > sum->maxlength)	{	    delDigitVec(sum->vec, sum->maxlength);	    sum->maxlength = neededlength;	    sum->vec = newDigitVec(&sum->maxlength);	}	sum->length =	    DigitVecCadd(sum->vec, a->vec, b->vec, a->length, b->length);	sum->sign = a->sign;	return;    }    else    {				/* Subtraktion */	neededlength = a->length;	if (neededlength < b->length)	    neededlength = b->length;	if (neededlength > sum->maxlength)	{	    delDigitVec(sum->vec, sum->maxlength);	    sum->maxlength = neededlength;	    sum->vec = newDigitVec(&sum->maxlength);	}	if ((b->length > a->length) || ((b->length == a->length)	    && DigitVecGt(b->vec, a->vec, a->length)))	{	    /* |b| > |a| */	    sum->length = DigitVecCsub(sum->vec, b->vec, a->vec,				       b->length, a->length);	    sum->sign = b->sign;	    return;	}	else	{	    /* |b| <= |a| */	    sum->length = DigitVecCsub(sum->vec, a->vec, b->vec,				       a->length, b->length);	    if (!sum->length)		sum->sign = PLUS;	    else		sum->sign = a->sign;	    return;	}    }}				/* IasIplI */void ImiasI(a, b)    register pInteger a;    register const Integer *b;/* a-=b; */{    if (a->sign != b->sign)    {	register int neededlength = a->length;	if (neededlength < b->length)	{	    neededlength = b->length;	}	neededlength++;	if (neededlength > a->maxlength)	{	    register DigitType *newv;	    register int oldlength = a->maxlength;	    a->maxlength = neededlength;	    newv = newDigitVec(&a->maxlength);	    a->length = DigitVecCadd(newv, a->vec, b->vec, a->length, b->length);	    delDigitVec(a->vec, oldlength);	    a->vec = newv;	    return;	}	else	{	    a->length = DigitVecCadd(a->vec, a->vec, b->vec, a->length, b->length);	    return;	}    }    else    {	/*	   Vorzeichen gleich, subtrahiere betragsmaessig kleineres von	   groesserem	*/	if ((b->length > a->length) || ((b->length == a->length)				  && DigitVecGt(b->vec, a->vec, a->length)))	{	    /* |b|>|a| */	    register int neededlength = b->length;	    if (neededlength <= a->maxlength)	    {		a->length = DigitVecCsub(a->vec, b->vec, a->vec,					 b->length, a->length);		a->sign ^= MINUS;		return;	    }	    else	    {		register DigitType *newv;		register int oldlength = a->maxlength;		a->maxlength = neededlength;		newv = newDigitVec(&a->maxlength);		a->length = DigitVecCsub(newv, b->vec, a->vec,					 b->length, a->length);		delDigitVec(a->vec, oldlength);		a->vec = newv;		a->sign ^= MINUS;		return;	    }	}	else	{	    /* |b| <= |a| */	    register int l = a->length;	    register DigitType *lp = &(a->vec[l - 1]);	    DigitVecCsubto(a->vec, b->vec, b->length);	    while ((l > 0) && (!*lp))	    {		l--;		lp--;	    }	    a->length = l;	    if (!l)		a->sign = PLUS;	    return;	}    }}				/* ImiasI */void IasImiI(diff, a, b)    register pInteger diff;    register const Integer *a, *b;/* diff=a-b; */{    register int neededlength;    if (diff == a)    {	ImiasI(diff, b);	return;    }    if (diff == b)    {	ImiasI(diff, a);	if (diff->length)	    diff->sign ^= MINUS;	return;    }    if (a->sign != b->sign)    {				/* Addition */	neededlength = a->length;	if (neededlength < b->length)	    neededlength = b->length;	neededlength++;	if (neededlength > diff->maxlength)	{	    delDigitVec(diff->vec, diff->maxlength);	    diff->maxlength = neededlength;	    diff->vec = newDigitVec(&diff->maxlength);	}	diff->length =	    DigitVecCadd(diff->vec, a->vec, b->vec, a->length, b->length);	diff->sign = a->sign;	return;    }    else    {				/* Subtraktion */	neededlength = a->length;	if (neededlength < b->length)	    neededlength = b->length;	if (neededlength > diff->maxlength)	{	    delDigitVec(diff->vec, diff->maxlength);	    diff->maxlength = neededlength;	    diff->vec = newDigitVec(&diff->maxlength);	}	if ((b->length > a->length) || ((b->length == a->length)	    && DigitVecGt(b->vec, a->vec, a->length)))	{	    /* |b| > |a| */	    diff->length = DigitVecCsub(diff->vec, b->vec, a->vec,					b->length, a->length);	    diff->sign = a->sign ^ MINUS;	    return;	}	else	{	    /* |b| <= |a| */	    diff->length = DigitVecCsub(diff->vec, a->vec, b->vec,					a->length, b->length);	    if (!diff->length)		diff->sign = PLUS;	    else		diff->sign = a->sign;	    return;	}    }}				/* IasImiI */void Iinc(a)    register Integer *a;/* a++; */{    if (a->sign == PLUS)    {	register int neededlength = a->length + 1;	DigitType b = 1;	if (neededlength > a->maxlength)	{	    register DigitType *newv;	    register int oldlength = a->maxlength;	    a->maxlength = neededlength;	    newv = newDigitVec(&a->maxlength);	    a->length = DigitVecCadd(newv, a->vec, &b, a->length, 1);	    delDigitVec(a->vec, oldlength);	    a->vec = newv;	    return;	}	else	{	    a->length = DigitVecCadd(a->vec, a->vec, &b, a->length, 1);	    return;	}    }    else    {	/* Subtrahiere 1 von |a| */	register int l = a->length;	register DigitType *lp = &(a->vec[l - 1]);	DigitType b = 1;	DigitVecCsubto(a->vec, &b, 1);	while ((l > 0) && (!*lp))	{	    l--;	    lp--;	}	a->length = l;	if (!l)	    a->sign = PLUS;	return;    }}				/* Iinc */void Idec(a)    register Integer *a;/* a--; */{    if (a->sign == MINUS)    {	register int neededlength = a->length + 1;	DigitType b = 1;	if (neededlength > a->maxlength)	{	    register DigitType *newv;	    register int oldlength = a->maxlength;	    a->maxlength = neededlength;	    newv = newDigitVec(&a->maxlength);	    a->length = DigitVecCadd(newv, a->vec, &b, a->length, 1);	    delDigitVec(a->vec, oldlength);	    a->vec = newv;	    return;	}	else	{	    a->length = DigitVecCadd(a->vec, a->vec, &b, a->length, 1);	    return;	}    }    if (!a->length)    {	a->sign = MINUS;	a->length = 1;	a->vec[0] = 1;	return;    }    else    {	/* Subtrahiere 1 von |a| */	register int l = a->length;	register DigitType *lp = &(a->vec[l - 1]);	DigitType b = 1;	DigitVecCsubto(a->vec, &b, 1);	while ((l > 0) && (!*lp))	{	    l--;	    lp--;	}	a->length = l;	return;    }}				/* Idec */BOOLEAN IeqI(a, b)/* return a==b; */    register const Integer *a, *b;{    if ((a->sign == b->sign) && (a->length == b->length) &&	DigitVecEq(a->vec, b->vec, a->length))	return TRUE;    else	return FALSE;}BOOLEAN IgtI(a, b)/* return a>b; */    register const Integer *a, *b;{    if (a->sign == PLUS)    {	if (b->sign == MINUS)	    return TRUE;	else	{	    if ((a->length > b->length) || ((a->length == b->length)				  && DigitVecGt(a->vec, b->vec, a->length)))		return TRUE;	    else		return FALSE;	}    }    else    {	if (b->sign == PLUS)	    return FALSE;	else	{	    if ((a->length > b->length) || ((a->length == b->length)				 && !DigitVecGt(b->vec, a->vec, a->length)))		return FALSE;	    else		return TRUE;	}    }}				/* IgtI */void Ineg(a)    register pInteger a;{    if (a->length)	a->sign ^= MINUS;}BOOLEAN IneI(a, b)/* return a!=b; */    const Integer *a, *b;{    return !IeqI(a, b);}BOOLEAN IgeI(a, b)/* return a>=b; */    const Integer *a, *b;{    return !IgtI(b, a);}BOOLEAN IltI(a, b)/* return a<b; */    const Integer *a, *b;{    return IgtI(b, a);}BOOLEAN IleI(a, b)/* return a<=b; */    const Integer *a, *b;{    return !IgtI(a, b);}BOOLEAN Ige0(a)    const Integer *a;{    return (a->sign == PLUS);}BOOLEAN Igt0(a)    const Integer *a;{    return ((a->sign == PLUS) && (a->length));}BOOLEAN Ile0(a)    const Integer *a;{    return (!a->length || (a->sign == MINUS));}BOOLEAN Ilt0(a)    const Integer *a;{    return (a->sign == MINUS);}BOOLEAN Ieq0(a)    const Integer *a;{    return (!a->length);}BOOLEAN Ieq1(a)    const Integer *a;{    if ((*(a->vec) == 1) && (a->length == 1) && (a->sign == PLUS))	return TRUE;    else	return FALSE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -