ACM大数四则运算模板函数
### ACM大数四则运算模板函数详解 在计算机科学领域,特别是编程竞赛中,处理大数的四则运算是一个非常常见的需求。由于标准的数据类型(如`int`、`long`等)无法存储非常大的数值,因此需要设计特殊的大数处理算法。本文将详细介绍一种实现大数加减乘除的C语言模板函数,并通过具体的代码片段进行解释。 #### 大数加法 ```c void add(char *a, char *b, char *c) { int i, j, k, max, min, n, temp; char *s, *pmax, *pmin; max = strlen(a); min = strlen(b); if (max < min) { temp = max; max = min; min = temp; pmax = b; pmin = a; } else { pmax = a; pmin = b; } s = (char*)malloc(sizeof(char) * (max + 1)); s[0] = '0'; for (i = min - 1, j = max - 1, k = max; i >= 0; i--, j--, k--) { s[k] = pmin[i] - '0' + pmax[j] - '0'; } for (; j >= 0; j--, k--) { s[k] = pmax[j] - '0'; } for (i = max; i >= 0; i--) { if (s[i] > '9') { s[i] -= 10; s[i - 1]++; } } if (s[0] == '0') { for (i = 0; i <= max; i++) { c[i - 1] = s[i]; } c[i - 1] = '\0'; } else { for (i = 0; i <= max; i++) { c[i] = s[i]; } c[i] = '\0'; } free(s); } ``` **解析:** 1. **参数说明:** - `a` 和 `b` 是两个待相加的大数字符串。 - `c` 是存放结果的大数字符串。 2. **实现逻辑:** - 首先确定两个数中较长的那个,并将较短的数与较长的数进行对齐。 - 从个位开始逐位相加,并处理进位问题。 - 最后检查最高位是否为0,如果是,则去除。 #### 大数减法 ```c void subtract(char *a, char *b, char *c) { int i, j, ca, cb; ca = strlen(a); cb = strlen(b); if (ca > cb || (ca == cb && strcmp(a, b) >= 0)) { for (i = ca - 1, j = cb - 1; j >= 0; i--, j--) { a[i] -= (b[j] - '0'); } for (i = ca - 1; i >= 0; i--) { if (a[i] < '0') { a[i] += 10; a[i - 1]--; } } i = 0; while (a[i] == '0') { i++; } if (a[i] == '\0') { c[0] = '0'; c[1] = '\0'; } else { for (j = 0; a[i] != '\0'; i++, j++) { c[j] = a[i]; } c[j] = '\0'; } } else { // 相反的情况 } } ``` **解析:** 1. **参数说明:** - `a` 和 `b` 是两个待相减的大数字符串。 - `c` 是存放结果的大数字符串。 2. **实现逻辑:** - 如果被减数小于减数,则交换两数的位置,并在最终结果前添加负号。 - 从高位到低位逐位相减,并处理借位问题。 - 去除前导零。 #### 大数乘法 ```c void multiply(char *a, char *b, char *c) { int i, j, ca, cb, *s; ca = strlen(a); cb = strlen(b); s = (int*)malloc(sizeof(int) * (ca + cb)); for (i = 0; i < ca + cb; i++) { s[i] = 0; } for (i = 0; i < ca; i++) { for (j = 0; j < cb; j++) { s[i + j + 1] += (a[i] - '0') * (b[j] - '0'); } } for (i = ca + cb - 1; i >= 0; i--) { if (s[i] >= 10) { s[i - 1] += s[i] / 10; s[i] %= 10; } } i = 0; while (s[i] == 0) { i++; } for (j = 0; i < ca + cb; i++, j++) { c[j] = s[i] + '0'; } c[j] = '\0'; free(s); } ``` **解析:** 1. **参数说明:** - `a` 和 `b` 是两个待相乘的大数字符串。 - `c` 是存放结果的大数字符串。 2. **实现逻辑:** - 使用二维数组模拟竖式乘法的过程。 - 计算每一位乘积并累加。 - 处理进位问题。 #### 大数除法 ```c int dividor(char *a, int b, char *c) { int i, j, temp = 0, n; char *s; n = strlen(a); s = (char*)malloc(sizeof(char) * (n + 1)); for (i = 0; a[i] != 0; i++) { temp = temp * 10 + a[i] - '0'; s[i] = temp / b + '0'; temp %= b; } s[i] = '\0'; for (i = 0; s[i] == '0' && s[i] != '\0'; i++); if (s[i] == '\0') { c[0] = '0'; c[1] = '\0'; } else { for (j = 0; s[i] != '\0'; i++, j++) { c[j] = s[i]; } c[j] = '\0'; } free(s); return temp; } ``` **解析:** 1. **参数说明:** - `a` 是待除的大数字符串。 - `b` 是除数。 - `c` 是存放商的大数字符串。 2. **实现逻辑:** - 使用临时变量`temp`来存储当前位的值。 - 逐位计算商并处理余数。 - 去除前导零。 ### 总结 以上介绍了大数四则运算的基本实现方法。这些算法模板适用于ACM竞赛以及其他需要处理大数的场景。通过这些模板,可以快速地解决相关问题,提高编程效率。需要注意的是,在实际应用时,还需要根据具体的问题场景进行适当的调整和完善。
- wind3894925512013-05-23方便易用..很不错./...
- blacker502015-10-18有用,能作为参考代码
- Sky_nwpu2013-08-25不愧是ACM,代码写得就是精简。。。
- pekingtsinghua2013-04-27这份代码非常好,是学习大数方面(高精度)的一份好资料
- lxghost22014-01-06写的不错的模板
- 粉丝: 48
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助