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

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

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

2高精度乘法原理

3高精度乘法的实现

a 运算前的准备

b一位位地运算

c处理进位

d输出结果

4整体的代码

5结语

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语言里的out函数,c语言 vc 用waveout函数写wave文件播放器

    用WaveOut函数写wave文件播放器 要炒菜的话,就得先准备工具,如锅.铲子.炉灶等.对程序来说,就是各种函数的应用.WaveOut函数在windowsAPI中属于低阶接口,用来播放的话需要用到下 ...

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

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

  3. c语言c判断字符数字,c语言问题求教 利用函数判断字符串中是否全为数字

    c语言问题求教 利用函数判断字符串中是否全为数字 答案:4  信息版本:手机版 解决时间 2018-12-22 19:42 已解决 2018-12-22 08:52 c语言问题求教 利用函数判断字符串 ...

  4. R语言stringr包str_detect函数检测字符串中模式存在与否实战

    R语言stringr包str_detect函数检测字符串中模式存在与否实战 目录 R语言stringr包str_detect函数检测字符串中模式存在与否实战 #导入stringr包

  5. R语言使用as.Date函数把dataframe中的多个数据列(multiple columns)从字符串转化到日期类型

    R语言使用as.Date函数把dataframe中的多个数据列(multiple columns)从字符串转化到日期类型 目录

  6. C语言 文件读写 fputs 函数 - C语言零基础入门教程

    目录 一.fgets 函数简介 二.fgets 函数使用 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.fgets 函数简介 fge ...

  7. C语言 文件读写 fputc 函数 - C语言零基础入门教程

    目录 一.fputc 函数简介 二.fputc 函数使用 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.fputc 函数简介 fpu ...

  8. C语言 文件读写 fseek 函数 - C语言零基础入门教程

    目录 一.fseek 函数简介 二.fseek 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.fseek 函数简介 fse ...

  9. C语言 文件读写 ferror 函数 - C语言零基础入门教程

    目录 一.ferror 函数简介 二.ferror 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.ferror 函数简介 ...

最新文章

  1. php管理txt文件系统,PHP文件系统管理详解
  2. Start here: portal to the lectures
  3. Mybatis中输入输出映射和动态Sql
  4. 抓取html中用到的css_如何使用HTML和CSS制作像《星球大战》一样的抓取文字
  5. 计算机网络实验报告访问控制列表,电子政务《计算机网络实验》期末报告 07-访问控制列表实验报告.doc...
  6. java 连接 sftp失败_java – 文件上传到SFTP失败(Apache VFS)
  7. JAVA面试题(1~95)《上》
  8. linux7配置静态地址,Centos7 配置静态 IP 地址的方法
  9. 【Angular 4】响应式编程
  10. Java多线程之同步与阻塞队列
  11. Android开发——Kotlin语法之Lambda表达式
  12. 该怎么标注建筑图纸后进行保存?
  13. mybatis 3.x 缓存Cache的使用
  14. Python计算机二级过考指南
  15. 图谱实战 | 再谈图谱表示:图网络表示GE与知识图谱表示KGE的原理对比与实操效果分析...
  16. 由于文件组 'PRIMARY 中的磁盘空间不足,无法为数据库 'newnet' 分配新页。请删除文件组中的对象、将其他文件添加到文件组或者为文件组中的现有文件启用自动增长,以便增加必要的空间。
  17. 输入法/非输入法切换 无法取消快捷键问题 以及 shift按键关闭CapsLock问题
  18. 新服务器如何装系统,新服务器怎么装系统
  19. 基于python下django框架 实现校园网站系统详细设计
  20. 从计算云到云计算,云可造化万象

热门文章

  1. 微型计算机的接口包括什么,微机原理与接口
  2. 红米10X和红米k30哪个好
  3. 可再生能源证书市场现状研究分析-
  4. css表格梅花,html表格美化css
  5. 聊聊异步编程的 7 种实现方式
  6. 使用PS批处理完成文件命名或者添加水印
  7. Python 扑克游戏
  8. 微信小程序适配iPhoneX底部小黑条
  9. Windows 8 把我给雷翻了,关机在哪儿呢?
  10. HTTP之X-Requested-With分析和思考