大一新生初谈C语言中的高精度乘法

1、为什么需要高精度乘法及其实质

我们知道,计算机内部直接用int或double等数据类型储存数字是有范围限制的,即当数据运算大小过大后,计算机将会出现溢出情况,使得计算结果不够精确。为了能够使计算机精确地计算高位的数字,我们需要学会使用高精度乘法。

事实上,高精度乘法就是通过编程的方法,把我们小学时候简单的数学乘法运算的步骤在计算机上完美的演示一遍而已

2、高精度乘法原理

既然是一个很大的整数,我们便不能够再用简单的数据类型直接储存这些整数。我们可以自然得想到要通过数组或字符串来储存数字。字符串的特点方便我们对于高位整数的输入,而整形数组的简便性更有利于每个位数的计算,因而我们结合两者的优点,不难得出高精度乘法的大致流程:

a、通过两个字符串输入两个整数;

b、引人两个数组,将两个整数通过一定的运算,分别将每一位的数字储存进数组中;

c、进行每一位的运算;

d、处理进位;

e、输出结果;

下面我们通过代码来一步步实现它

3、高精度乘法的实现

(a) 运算前的准备

#include

#include

int main() {

char number1[1500], number2[1500];

scanf("%s%s", number1, number2);

int n = strlen(number1), m = strlen(number2);

int a[n], b[m];

上面的代码使我们输入了两个乘数,并且通过strlen函数确定了乘数的位数,并且将整形数组的长度同时定位好了。

我们接着来写:

int i, j;

for (i = 0, j = n - 1; i < n; i++, j--) { a[i] = numberN[j] - '0'; }

for (i = 0, j = m - 1; i < m; i++, j--) { b[i] = numberM[j] - '0'; }

通过ASCII码的运算,我们已经成功地将两个乘数的各位数拆开来储存进两个数组中了,并且a[0]为个位,a[1]为十位,以此类推。此时高精度乘法运算前的准备已经做好。

(b)一位位地运算

我们再声明一个数组c来储存答案。大家通过一个简单的乘法运算进行模拟就可以看出,以同样的储存规则,a[0] * b[0] = c[0]; a[0] * b[1] + a[1] * b[0] = c[1];逐渐我们可以发现规律: "c[i + j] += a[i] * b[j]"同过一个循环去实现,就可以把c[i + j]计算出来,需要指出的是,这里的计算我们还没有进行进位处理。

1 2 3

* 5 6 7

*--------------------------

7 14 21

6 12 18

5 10 15

*--------------------------

5 16 34 32 21

下面上代码:

int c[3000];

for (i = 0; i < 3000; i++) { c[i] = 0; }

for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { c[i + j] += a[i] * b[j]; }

}

注意一下:这里数组c的长度并不一定是3000,操作者可以根据实际情况来调整结果最大位数的大小,虽然我觉得3000是够用了。。。

(c)处理进位

for (i = 0; i < n + m; i++) { if (c[i] >= 10) { c[i + 1] += c[i] / 10; c[i] %= 10; }

}

这个进位的处理代码并不难,有一定c语言初级基础的人都可以看懂(笔者写这篇博客时候还只是一个上大一2个月的新生呢。。。)

(d)输出结果

好了,现在我们要输出结果了。我们知道,现在c数组里储存着结果的各位数字,我们只需要按照正确的顺序把数字一个个print出来就可以了!

for (j = 2999; j > 0; j--) {

if (c[j] != 0)

break;

}

for (i = j; i >= 0; i--) {

printf("%d", c[i]);

}

printf("\n");

return 0;

}

在这里我需要指出的是,因为c数组的长度是固定的,但我们并不知道最终的结果有多少位,而我们又可以看出结果应该从后往前print。所以在输出前需要用一个for循环确定一下结果的位数。(笔者能力有限,暂时还没有想出更好的方法。。。)

确定了位数之后,就从后往前输出就可以得到正确的答案了!!!

(有点小激动。。。)

4、整体的代码

为了方便读者的阅读,我把第3部分的肢解代码集中起来:

#include

#include

int main() {

char numberN[1500], numberM[1500];

scanf("%s%s", numberN, numberM);

int n = strlen(numberN), m = strlen(numberM);

int a[n], b[m];

int i, j;

for (i = 0, j = n - 1; i < n; i++, j--) {

a[i] = numberN[j] - '0';

}

for (i = 0, j = m - 1; i < m; i++, j--) {

b[i] = numberM[j] - '0';

}

int c[3000];

for (i = 0; i < 3000; i++) {

c[i] = 0;

}

for (i = 0; i < n; i++) {

for (j = 0; j < m; j++) {

c[i + j] += a[i] * b[j];

}

}

for (i = 0; i < n + m; i++) {

if (c[i] >= 10) {

c[i + 1] += c[i] / 10;

c[i] %= 10;

}

}

for (j = 2999; j > 0; j--) {

if (c[j] != 0)

break;

}

for (i = j; i >= 0; i--) {

printf("%d", c[i]);

}

printf("\n");

return 0;

}

5、结语

笔者是中山大学软件工程专业的一位大一新生,最近刚接触到高精度乘法,觉得有点神奇,于是写下这篇博客(这是我的第一篇与技术有关的博客。。。),再梳理一遍后思路的确更加清晰了。由于还没有深入精通C语言,所以这个高精度乘法的代码还不够简洁,高手勿喷。如果大家有更好的建议欢迎提出交流,我会虚心学习的。同时,希望这篇博客能够帮助到更多的接触高精度乘法的C语言初学者们,我个人觉得写得还是挺通俗易懂的。。。 如果有个别字打错的,请多包涵。。。 好了,最后谢谢大家的认真阅读!!!!!!

高精度数乘法进位c语言,C语言中的高精度乘法相关推荐

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

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

  2. 求一个整数的权重 c语言,Code Kata:大整数四则运算—乘法 javascript实现

    上周练习了加减法,今天练习大整数的乘法运算. 采取的方式同样为竖式计算,每一位相乘后相加. 乘法函数: 异符号相乘时结果为负数,0乘任何数都为0 需要调用加法函数 因为输入输出的为字符串,需要去除字符 ...

  3. c语言一个数中是否含有8,要心中有“数”——C语言初学者代码中的常见错误与瑕疵(8)...

    在 飞鸟_Asuka网友指出"是不是时间复杂度比较大",并说他"第一眼看到我就想把它当成一个数学问题来做"之后,我又重新对问题进行了数学式的思考后发现的. 这个 ...

  4. 使用c语言函数使二数相减,什么是c语言

    手机评站网今天精心准备的是<什么是c语言>,下面是详解! 什么是C语言和C+语言 1.C语言. C语言诞生得非常早,当时人们普遍还习惯用汇编语言编写软件,并且没有什么统一,通用的操作系统, ...

  5. C语言怎样判断乘法越界,如何判断C语言算术运算的越界问题

    大量的安全漏洞是由于计算机算术运算的微妙细节引起的, 具体的C语言, 诸如符号数和无符号数之间转换, 算术运算的越界都会导致不可预知的错误和安全漏洞, 具体的案例数不胜数. 作为一个系统程序员, 有必 ...

  6. ad7714 c语言程序,基于AD7714的高精度数字化称重传感器设计.pdf

    第 3 1卷第 5期 2 0 0 9年 1 O月 电气电子教学学报 J OURNAL OF E EE Vo1 31 No 5 Oc t 2 0 0 9 基于 AD 7 7 1 4的高精度数字化称重传感 ...

  7. 十进制数的原码 c语言,C语言程序设计第1章节(zmy).ppt

    C语言程序设计第1章节(zmy).ppt 张茂元 副教授, 硕士生导师, 博士后 华中科技大学计算机学院 2007年2月;C语言程序设计-第1章 概论;1.1 学习C语言程序设计的第一个例子 ;例1. ...

  8. C语言判断数组中是否存在该数

    C语言判断数组中是否存在该数 #include<stdio.h> int main() {int query(int a[10],int num);int num;printf(" ...

  9. c语言中左移和乘法谁高级,C程序员说使用移位运算代替乘法和除法更有效,是真的吗?...

    在C语言程序开发中,某些移位操作似乎达到与乘法和除法运算相同的效果. 例如,4 >> 1等于2,向右移一位等于2除. 类似地,2 << 1等于4,向左移一位等于2. 因此,一些 ...

最新文章

  1. 批处理如何做到等待用户输入一个值(dos命令行)
  2. 当思想与机器融合:脑机接口与人类的现在、困境与未来
  3. win10计算机如何切换用户名,Win10怎么修改本地账号的用户名 win10本地账户改名图文教程...
  4. 【收藏】gitee:使用k8s部署nacos
  5. android通过代码设置铃声_第六十四回:Android中UI控件之SeekBar
  6. 利用HttpSessionListener实现网站在线人数统计功能
  7. 强烈推荐!商汤-港中文MMLab开源图像视频超分辨率工具箱MMSR
  8. 可编辑PSD分层疫情防护宣传海报
  9. 学c语言做练习之文件
  10. 2台mysql集群_如何安装配置基于2台服务器的MySQL集群
  11. 【Android 界面效果13】关于全屏和取消标题栏
  12. 软考-信息系统项目管理师-项目进度管理
  13. 与现代教育技术有关的计算机知识,基于计算机的现代教育技术手段的利用与开发...
  14. 什么编程语言的开发者平均年薪高达94万?
  15. Flink_Flink ON YARN containerized.heap-cutoff-min 内存调整
  16. Jenkins部署到远程服务器
  17. LeeCode 算法(Java实现)系列汇总
  18. 高通Camera驱动(2)-- openinitialize
  19. linux 扩展pam支持第三方认证
  20. python怎么表白源码_Python浪漫表白源码(附带详细教程)-Go语言中文社区

热门文章

  1. 最长子序列DP和二分法
  2. 导入Excel文件的方法
  3. 基于人脸识别的“带口罩”系统-python完整实现
  4. 自从被国家认定为新时代的农民工过后,国家又不让我 996 了.
  5. NSString文本替换
  6. smarty实例教程一
  7. QQ引流脚本,QQ扩列引流脚本实操演示
  8. dpdk pktgen发包工具使用
  9. HACKTHEBOX——Nibbles
  10. Spring-Boot框架学习视频-百度云盘