大一小白尝试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语言实现高精度乘法相关推荐

  1. 在计算机语言中的乘法,LOGO语言编程题  高精度乘法★★

    不限制位数的整数高精度乘法★★★★ 这是"高精度算法"系列文章中的第二篇.在"高精度加.减.乘.除"这4种计算中,加法最基础.最简单,乘法稍难,减法更难,除法最 ...

  2. 高精度数乘法进位c语言,C语言中的高精度乘法

    大一新生初谈C语言中的高精度乘法 1.为什么需要高精度乘法及其实质 我们知道,计算机内部直接用int或double等数据类型储存数字是有范围限制的,即当数据运算大小过大后,计算机将会出现溢出情况,使得 ...

  3. 如何用c语言做高精度计算原理,C语言羁绊之高精度乘法计算

    很大一部分借鉴了(C语言的高精度算法)这一博客,你们可以去看看.欢迎指正!!! 1,定义 对于计算机无法用普通数据类型(如:longint)表示的大整数进行乘法运算,称为高精度算法.这里的高精度乘法主 ...

  4. c语言里的乘法函数,C语言中的高精度乘法

    大一新生初谈C语言中的高精度乘法 大一新生初谈C语言中的高精度乘法 1为什么需要高精度乘法及其实质 2高精度乘法原理 3高精度乘法的实现 a 运算前的准备 b一位位地运算 c处理进位 d输出结果 4整 ...

  5. C语言实现高精度除高精度

    大一小白尝试高精度除高精度 引言 笔者是一位大一学生,在做题的过程中接触到了高精度除法,写下这篇博客帮助理清思路.希望这篇博客能够帮助到更多刚接触C语言的同学们.如果文中有错误,欢迎指正. 一.什么是 ...

  6. 高精度乘法(c++)

    高精度乘法 #include <iostream> #include <cstring> #include <algorithm>using namespace s ...

  7. 高精度乘法的介绍以及模板的分享

    今天我们来讲讲高精度乘法 什么是高精度乘法呢? 我们来看看百度百科什么介绍高精度乘法的,同样是因为存储数据的问题,大整数的乘法必定会有溢出的时候,那么我们应该怎么计算呢 其实乘法的计算也不难,我们这里 ...

  8. 算法分析c语言大整数乘法,大整数乘法浅析(C语言实现)

    1.引言 最近在做学校网上的OJ题时,碰到了高精度加法和乘法的运算.加法没有太多实现上的困难,但是乘法却卡了一会儿,在网上搜集材料时,很多都是直接贴上了代码,没有具体的分析.为了巩固自己的学习成果并且 ...

  9. 朴素高精度乘法的常数优化

    2015年辽宁省赛热身赛有一道高精度乘法 传送门:NEUOJ 1574 A*B 1574: A * B 时间限制: 10 Sec  内存限制: 128 MB 题目描述 Calculate $a \ti ...

最新文章

  1. BZOJ-1027 [JSOI2007]合金
  2. 《Python数据可视化编程实战》—— 1.6 安装图像处理工具:Python图像库(PIL)...
  3. 进程用户态 上下文切换需要保存哪些_漫话性能:CPU上下文切换
  4. VTK:参数Kuen用法实战
  5. ITK:使用Otsu阈值图像
  6. 牛客-服务器需求【线段树】
  7. argmax函数_Python科学计算库numpy——统计函数
  8. 如何评价一个RPC框架的性能
  9. 【报告分享】2020直播电商分析报告-抖音VS快手.pdf(附下载链接)
  10. 团体程序设计天梯赛-练习集L1-002. 打印沙漏
  11. android监听卡1电话,Android 监听 SIM 卡状态
  12. 用Java实现网易云音乐爬虫(非selenium)
  13. 什么是误报?如何识别误报和漏报
  14. sqlzoo错题总结-1
  15. 艰难春招,终于offer
  16. Anaconda3安装
  17. java中EQ、NE、GT、GE、LT、LE分别代表含义
  18. 【网络安全】溯源NAT之前的IP地址
  19. AV1视频编码标准资源汇总 转载
  20. 校园网服务器系统需求分析,校园网需求及分析.doc

热门文章

  1. SAP学习之配置篇——工厂日历
  2. 天玑1080相当于骁龙多少处理器 天玑1080处理器怎么样
  3. 西瓜书第六章笔记及答案——支持向量机
  4. 基于Isotonic回归(保序回归算法)的鸢尾花数据集回归问题
  5. 线性回归模型(OLS)1
  6. 国美金融贷款构建Hadoop 系统架构(国美金融贷款分支)
  7. 聚类算法评价指标——Normalized Mutual Information, NMI指数
  8. 不要再纠结React与Vue的好坏这个问题了
  9. 【找工作资料】英文面试问题集
  10. C++ MFC picture control控件按比例显示任意图片文件(jpg、bmp等)