C语言实现高精度乘法
大一小白尝试C语言高精度乘法
一、高精度乘法是什么
高精度乘法就是对于普通数据类型无法表示的大整数进行乘法运算。
二、为什么需要高精度乘法
在C语言中,常用的数据类型有int, long long, double等,但是这些数据类型的大小有限,当输入的数据过大,这些数据类型就无法实现其功能,强行使用可能会出现错误。在这种情况下,我们需要高精度乘法来完成运算。
三、如何实现高精度乘法
为了更方便的理解高精度乘法,我们先从熟悉的竖式乘法开始。首先我们知道,电脑笨笨的,普通数据类型算不了大数乘法。但是小学的时候我们很聪明,学习了竖式乘法,表达是这样的。
过程是这样的,我们根据九九乘法表对于两位单独的数字进行运算,列在对应的位置上,最后进行累加并完成进位。
所以理论上来说,我们可以用竖式乘法计算很大的数。
四、实现
于是我们有了高精度乘法的实现思路:
1.输入
2.各位相乘相加
3.进位
4.输出
至于采取什么样的数据类型存储输入输出,答案显而易见,字符串是十分合适的。至此,我们有了大体的思路。那么就可以开始处理数据了。
首先是输入的一些准备工作,我们需要两个字符串来存储因数,以及一个字符串来存储答案,为了方便计算,我们将char的数转变为int类型。
void High_Precision_Multiplication(char c_number_1[], char c_number_2[], char c_answer[]) {int i_number_1[Number_Size];//第一个数字int i_number_2[Number_Size];//第二个数字int i_answer[Number_Size];//结果//可以在线处理int length_1 = strlen(c_number_1);//第一个数字的位数(长度)int length_2 = strlen(c_number_2);//第二个数字的位数(长度)int length_3;//答案的位数int i, j;char temp;//用于逆转memset(c_answer, 0, length_answer);memset(i_number_1, 0, sizeof(i_number_1));memset(i_number_2, 0, sizeof(i_number_2));memset(i_answer, 0, sizeof(i_answer));//完成初始化
}
逆转和数字转换
for (i = 0; i < length_1; i++) {i_number_1[i] = c_number_1[length_1 - i - 1] - '0';}for (i = 0; i < length_2; i++) {i_number_2[i] = c_number_2[length_2 - i - 1] - '0';}//完成逆转+数字转换
竖式乘法
for (i = 0; i < length_1; i++) {for (j = 0; j < length_2; j++) {i_answer[i + j] += i_number_1[i] * i_number_2[j];}}//完成相乘
根据竖式乘法的规则我们知道,上面代码的第三行是成立的。
进位
for (i = 0; i < length_1 + length_2 - 1; i++) {if (i_answer[i] >= 10) {i_answer[i + 1] += i_answer[i] / 10;i_answer[i] %= 10;}}//完成进位
逆转和输出
为了方便输出,我们将答案转换回字符,并逆转头尾
i = 0;while (i_answer[i] || i < length_1 + length_2 - 1) {i_answer[i] += '0';i++;}//转换回字符length_3 = i;i = 0;while (i < length_3 - i - 1) {temp = i_answer[i];;i_answer[i] = i_answer[length_3 - i - 1];i_answer[length_3 - i - 1] = temp;i++;}//逆转回去for (i = 0; i < length_3; i++) {c_answer[i] = i_answer[i];}//输出答案
五、最后的代码
将各部分代码合并,我们就得到了高精度乘法的函数
void High_Precision_Multiplication(char c_number_1[], char c_number_2[], char c_answer[], int length_answer) {int i_number_1[Number_Size];//第一个数字int i_number_2[Number_Size];//第二个数字int i_answer[Number_Size];//结果//可以在线处理int length_1 = strlen(c_number_1);//第一个数字的位数(长度)int length_2 = strlen(c_number_2);//第二个数字的位数(长度)int length_3;//答案的位数int i, j;char temp;//用于逆转memset(c_answer, 0, length_answer);memset(i_number_1, 0, sizeof(i_number_1));memset(i_number_2, 0, sizeof(i_number_2));memset(i_answer, 0, sizeof(i_answer));for (i = 0; i < length_1; i++) {i_number_1[i] = c_number_1[length_1 - i - 1] - '0';}for (i = 0; i < length_2; i++) {i_number_2[i] = c_number_2[length_2 - i - 1] - '0';}//完成逆转+数字转换for (i = 0; i < length_1; i++) {for (j = 0; j < length_2; j++) {i_answer[i + j] += i_number_1[i] * i_number_2[j];}}//完成相乘for (i = 0; i < length_1 + length_2 - 1; i++) {if (i_answer[i] >= 10) {i_answer[i + 1] += i_answer[i] / 10;i_answer[i] %= 10;}}//完成进位i = 0;while (i_answer[i] || i < length_1 + length_2 - 1) {i_answer[i] += '0';i++;}//转换回字符length_3 = i;i = 0;while (i < length_3 - i - 1) {temp = i_answer[i];;i_answer[i] = i_answer[length_3 - i - 1];i_answer[length_3 - i - 1] = temp;i++;}//逆转回去for (i = 0; i < length_3; i++) {c_answer[i] = i_answer[i];}//输出答案return;
}
六、结语
这个函数接受三个char*,并将前两个数字相乘,输出到第三个字符串中,但是该函数没有输入检测,也没有输出检测。而且这个函数占用了很多不必要的内存空间,为了步骤清晰,进行了很多不必要的分划,时间效率也不高。仍有大量可以优化的空间。
笔者是一位大一学生,因为手动实现高精度乘法的过程中出现了一些问题,因此写下这篇博客帮助理清思路。希望这篇博客能够帮助到更多刚接触C语言的同学们。如果文中有错误,欢迎指出。十分感谢各位的阅读!
C语言实现高精度乘法相关推荐
- 在计算机语言中的乘法,LOGO语言编程题 高精度乘法★★
不限制位数的整数高精度乘法★★★★ 这是"高精度算法"系列文章中的第二篇.在"高精度加.减.乘.除"这4种计算中,加法最基础.最简单,乘法稍难,减法更难,除法最 ...
- 高精度数乘法进位c语言,C语言中的高精度乘法
大一新生初谈C语言中的高精度乘法 1.为什么需要高精度乘法及其实质 我们知道,计算机内部直接用int或double等数据类型储存数字是有范围限制的,即当数据运算大小过大后,计算机将会出现溢出情况,使得 ...
- 如何用c语言做高精度计算原理,C语言羁绊之高精度乘法计算
很大一部分借鉴了(C语言的高精度算法)这一博客,你们可以去看看.欢迎指正!!! 1,定义 对于计算机无法用普通数据类型(如:longint)表示的大整数进行乘法运算,称为高精度算法.这里的高精度乘法主 ...
- c语言里的乘法函数,C语言中的高精度乘法
大一新生初谈C语言中的高精度乘法 大一新生初谈C语言中的高精度乘法 1为什么需要高精度乘法及其实质 2高精度乘法原理 3高精度乘法的实现 a 运算前的准备 b一位位地运算 c处理进位 d输出结果 4整 ...
- C语言实现高精度除高精度
大一小白尝试高精度除高精度 引言 笔者是一位大一学生,在做题的过程中接触到了高精度除法,写下这篇博客帮助理清思路.希望这篇博客能够帮助到更多刚接触C语言的同学们.如果文中有错误,欢迎指正. 一.什么是 ...
- 高精度乘法(c++)
高精度乘法 #include <iostream> #include <cstring> #include <algorithm>using namespace s ...
- 高精度乘法的介绍以及模板的分享
今天我们来讲讲高精度乘法 什么是高精度乘法呢? 我们来看看百度百科什么介绍高精度乘法的,同样是因为存储数据的问题,大整数的乘法必定会有溢出的时候,那么我们应该怎么计算呢 其实乘法的计算也不难,我们这里 ...
- 算法分析c语言大整数乘法,大整数乘法浅析(C语言实现)
1.引言 最近在做学校网上的OJ题时,碰到了高精度加法和乘法的运算.加法没有太多实现上的困难,但是乘法却卡了一会儿,在网上搜集材料时,很多都是直接贴上了代码,没有具体的分析.为了巩固自己的学习成果并且 ...
- 朴素高精度乘法的常数优化
2015年辽宁省赛热身赛有一道高精度乘法 传送门:NEUOJ 1574 A*B 1574: A * B 时间限制: 10 Sec 内存限制: 128 MB 题目描述 Calculate $a \ti ...
最新文章
- BZOJ-1027 [JSOI2007]合金
- 《Python数据可视化编程实战》—— 1.6 安装图像处理工具:Python图像库(PIL)...
- 进程用户态 上下文切换需要保存哪些_漫话性能:CPU上下文切换
- VTK:参数Kuen用法实战
- ITK:使用Otsu阈值图像
- 牛客-服务器需求【线段树】
- argmax函数_Python科学计算库numpy——统计函数
- 如何评价一个RPC框架的性能
- 【报告分享】2020直播电商分析报告-抖音VS快手.pdf(附下载链接)
- 团体程序设计天梯赛-练习集L1-002. 打印沙漏
- android监听卡1电话,Android 监听 SIM 卡状态
- 用Java实现网易云音乐爬虫(非selenium)
- 什么是误报?如何识别误报和漏报
- sqlzoo错题总结-1
- 艰难春招,终于offer
- Anaconda3安装
- java中EQ、NE、GT、GE、LT、LE分别代表含义
- 【网络安全】溯源NAT之前的IP地址
- AV1视频编码标准资源汇总 转载
- 校园网服务器系统需求分析,校园网需求及分析.doc