大整数运算

来源:互联网 发布:人工智能弹钢琴 编辑:程序博客网 时间:2024/05/02 01:25

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

1 0
原创粉丝点击