大整数运算

包括大整数的四则运算,一般都是用数组来模拟大整数的,如果是每一位数组只存一位数的话,空间浪费比较严重,所以这里每一位数组存储4位数,所以是10000进制。


加法:

输入:不超过两百位的非负整数,可能有多余的前导零。

输出:相加后的结果,不能有多余的前导零

首先是一些基本的常量定义

#define BIR 10000
#define RL 4
#define MAX_LEN (200/RL+1)

打印大整数函数:

void print(const int x[])
{
	int output=0;
	for(int  i=MAX_LEN-1;i>=0;i--)
	{
		if(output==1)
		{
			printf("%d",x[i]);
		}
		else if(x[i]>0)
		{
			output=1;
			printf("%d",x[i]);
		}
	}
	if(output==0)
	printf("0");
}

从字符串中提取到数组中:

void input(const char s[],int x[])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < MAX_LEN; i++)
		x[i] = 0;
	int len = strlen(s);
	int sum = 0;
	for (i = len; i > 0; i-=4)
	{

		int low = i - 4;
		if (low < 0)
			low = 0;
		for (int k = low; k < i; k++)
		{
			sum = sum * 10 + s[k] - '0';
		}
		x[j++] = sum;
	}
}

加法运算:

void bigint_add(const int x[],const int y[],int z[])
{
	int i = 0;
	for ( i = 0; i < MAX_LEN; i++)
		z[i] = 0;

	for (i = 0; i < MAX_LEN; i++)
	{
		z[i] += x[i] + y[i];
		if (z[i]>BIR)
		{
			z[i] -= BIR;
			z[i + 1]++;
		}
	}
}

减法运算:

void bigint_sub(const int x[], const int y[], int z[])//x>y
{
	int i = 0;
	for (i = 0; i < MAX_LEN; i++)
		z[i] = 0;
	for (i = 0; i < MAX_LEN; i++)
	{
		z[i] += x[i] - y[i];
		if (z[i] < 0)
		{
			z[i] += BIR;
			z[i + 1]--;
		}
	}
}


乘法运算:

void bigint_mul(const int x[], const int y[], int z[])
{
	int i = 0, j = 0;
	for (i = 0; i < MAX_LEN * 2; i++)
		z[i] = 0;

	for (i = 0; i < MAX_LEN; i++)
	{
		for (j = 0; j < MAX_LEN; j++)
		{
			z[i+j] += x[i] * y[i];
			if (z[i+j]>BIR)
			{
				z[i + j + 1] += z[i + j] / BIR;
				z[i + j] = z[i + j] % BIR;
			}
		}
	}
}

除法运算:

除法比较难

int length(const int x[])
{
	int i = 0;
	int len = 0;
	for (i = MAX_LEN-1; i >= 0; i--)
	{
		if (x[i] > 0)
		{
			len = i + 1;
			break;
		}
	}
	return len;

}

int bigint_sub2(int x[], const int y[])
{
	int i;
	int lenx = length(x);
	int leny = length(y);
	int larger;
	//判断x是否比y大
	if (lenx - leny < 0)
		return -1;
	else if (lenx == leny)
	{
		 larger = 0;
		for (i = MAX_LEN - 1; i >= 0; i--)
		{
			if (x[i]>y[i])
			{
				larger = 1;
				break;//x>y
			}
			else if (x[i] < y[i])
			{
				if (!larger)
					return -1;//x<y
			}
		}
	}

	if (larger == 0)
		return 0;

	for (i = 0; i < MAX_LEN; i++)
	{
		x[i] -= y[i];
		if (x[i] < 0)
		{
			x[i] += BIR;
			x[i + 1]--;
		}
	}
	return 1;
}

void bigint_div(int x[], const int y[], int z[])
{
	int i;
	int *yy;
	int lenx = length(x);
	int leny = length(y);
	int times = lenx - leny;
	for (i = 0; i < MAX_LEN; i++)
		z[i] = 0;
	if (times < 0)
		return;

	yy = (int *)malloc(sizeof(int)*MAX_LEN);
	memcpy(yy, y, sizeof(int)*MAX_LEN);
	//将yy右移times位
	for (i = lenx - 1; i >= 0; i--)
	{
		if (i>=times)
			yy[i] = yy[i - times];
		else
			yy[i] = 0;
	}

	leny = lenx;
	for (i = 0; i <=times; i++)
	{
		while (bigint_sub2(x, yy) >= 0)
		{
			z[times - i]++;
		}

		for (i = 1; i < leny; i++)
		{
			yy[i - 1] = yy[i];
		}
		leny--;
		yy[leny] = 0;

	}

	for (i = 0; i < times; i++)
	{
		if (z[i]>BIR)
		{
			z[i + 1] += z[i] / BIR;
			z[i] = z[i] % BIR;
		}
	}
	free(yy);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值