入门篇:高精度乘法
2015-11-03 00:04
246 查看
高精度乘法
标签:C语言 高精度乘法–by 小威威
1.为什么写这篇文章
在本次实验课作业中,出现了高精度乘法,而老师还没有讲到,所以需要靠我们自己自学。然而,在网上许多高精度是错误的,即放到编译器中无法正常运行,百度百科的高精度算法是个坑!!!同时,即使是正确的,也只是一大段代码扔出来,根本没有详细的解释,很难看懂。故我写这篇文章是为了帮助与我有共同需求的初学者入门高精度乘法。也许我的算法很渣,但足以入门,接下来就要靠你自己探索咯。
2.高精度乘法实例
# include <stdio.h> # include <string.h> // 调用strlen函数的头文件 int main(void) { char a1[250], b1[250]; // 先定义两个字符数组,用于存储两个较多位数的乘数 int a[250], b[250], c[500] = {0}; // 再定义三个数组,前两个用于接收字符数组里的数字各个位的数值,最后一个用于存储最终结果的各个位的数值 int len1, len2, len; // 前两个分别表示字符数组a1,b1的实际长度,最后一个表示两个字符数组实际长度之和 scanf("%s%s", a1, b1); // 对两个字符数组进行赋值 len1 = strlen(a1); // 将字符串a1的长度赋给len1,用于数组的赋值 len2 = strlen(b1); // 将字符串b1的长度赋给len2, 用于数组的赋值 len = len1 + len2; // 将两字符串实际长度之和赋给len for (int i = 0; i < len1; i++) // 用for循环,实现字符数组a1内数字向数组转移 a[i] = a1[len1-1-i] - '0'; /* 不过,字符数组内的数字与数组内数字顺序相反,这与乘法原理有关,根据ASCII,字符数组内的数字要转化成实际的数字,就要减去48,因为‘0’的ASCII码恰好是48,所以将字符数组元素-‘0’以实现转化 */ for (int j = 0; j < len2; j++) // 用for循环,实现字符数组b1内数字向数组转移 b[j] = b1[len1-1-j] - '0'; for (int i = 0; i < len1; i++) // 接下来这两个嵌套的for循环便是高精度乘法的核心 for (int j = 0; j < len2; j++) { // 此处这短短三步需要结合乘法原理理解,用文字很难表达 c[i+j] += a[i]*b[j]; // 数字的其中一位与另一数字其中一位相乘,先不考虑进位情况 c[i+j+1] += (c[i+j]) / 10; // 除以10的作用便是判断进多少(注意是c[i+j]) c[i+j] = c[i+j] % 10; // 进位结束以后该数位便只去各位,故将其取余取余数(注意是c[i+j]) } // 此处第一、第二个式子用+=,原因可根据乘法原理解释,第三个式子无需+=,原因是取该位数总值的个位即可 if (c[len-1] == 0) // 此处是判断输出的第一个数位是否为0,若为0,忽略该位数,即总长减去1 len--; for (int i = len-1; i >= 0; i--) // 倒着输出数组内的数字,得到最终结果 printf("%d", c[i]); return 0; }
在该算法的核心部分,我可能讲的不大详细,这里就做一点补充吧。
3.算法核心补充
高精度乘法主要是根据乘法原理设计的。
乘法原理就是我们平时在纸上所用到的乘法运算:如
25
* 25
————————
125
50
————————
625
按照该原理设计for循环,实现各位数的相乘,同时实现进位等操作。
以上内容皆为个人观点,如果有问题欢迎大家提出来,我们一起探讨。
相关文章推荐
- CF#200 div2 C Rational Resistance(math gcd)
- 我们为什么越来越没有了自己的个性
- 独家爆料:小鸟云的前世今生
- 正则表达式链接替换函数的技巧
- 正则表达式Regular Expression (RegExp)详解
- Visual Studio调试技巧汇总
- 分享Visual Studio原生开发的10个调试技巧(2)
- Microsoft Visual Studio 2010下如何添加命令提示行
- php获取远程文件的内容和大小
- 详解PHP+AJAX无刷新分页实现方法
- smarty简单应用实例
- php在数据库抽象层简单使用PDO的方法
- php去除二维数组的重复项方法
- thinkphp如何获取客户端IP
- php实现zip文件解压操作
- php中注册器模式类用法实例分析
- PHP翻页跳转功能实现方法
- php实现分页显示
- golang标准库flag包实现实现命令行解析
- golang标准库reflect包实现操作任意类型对象