大整数运算
来源:互联网 发布:人工智能弹钢琴 编辑:程序博客网 时间: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
- 大整数运算
- 大整数运算类
- 大整数运算问题
- C++ 大整数运算
- 浅析大整数运算
- 大整数运算包
- 大整数运算
- Java 大整数运算
- C++大整数运算
- 大整数运算java
- 大整数运算
- 大整数运算
- 大整数型运算
- 正常大整数运算
- 大整数的运算实现
- 大整数加减乘除运算类
- 大整数运算(乘法)
- 大整数运算(加法)
- qt 设置字体和大小
- 数据库的完整性
- CentOS Linux 升级内核步骤、方法
- 闲话函数式变成与OOP
- 八达岭动物园老虎咬死巡逻员
- 大整数运算
- 退出MFC应用程序的方法集
- 八达岭动物园老虎咬死巡逻员
- 八达岭动物园老虎咬死巡逻员
- 八达岭动物园老虎咬死巡逻员
- 八达岭动物园老虎咬死巡逻员
- STL array的rend方法(17)
- BaseDB MongoDb dao数据库操作类
- Leetcode 细节实现 Rotate Image