包括大整数的四则运算,一般都是用数组来模拟大整数的,如果是每一位数组只存一位数的话,空间浪费比较严重,所以这里每一位数组存储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);
}