文章目录

  • 前言:为什么我们需要高精度算法?
  • 一、高精度算法基础
  • 二、高精度乘法
    • 1.计算流程
    • 2.完整代码
  • 三、总结

前言:为什么我们需要高精度算法?

多数时候我们需要进行非常庞大的数字运算,其中涉及四则运算,加减乘除,但是当连最大的long long类型也容纳不下如此大的数字的时候,我们应该怎么办?
那么,我们就要用到今天所介绍的高精度算法,顾名思义,我们可以用一些特殊的方式来得出我们想要计算的答案。

一、高精度算法基础

在讲高精度算法之前,我们需要引入数组和字符串这两位我们在学习过程中的老朋友。
第一:我们知道,数组的优点是可以储存大量数字,并且每一位都是数的形式,运算时非常方便,但是数组在输入的时候必须要有分隔符,不符合数字的输入习惯。
第二:我们知道,字符串在输入的时候是连续的,不需要分隔符,非常符合数字的输入习惯,但是不能直接进行运算,非常不方便。
所以,我们可以就其两者取长补短,用数组来进行运算和储存数据,用字符串来输入数据!

二、高精度乘法

1.计算流程

  1. 通过字符串引入两串数字分别存放到两个字符数组
  2. 将其每一位数字逆序分别存放到两个整型数组
  3. 进行计算并处理进位(关键)
  4. 将结果存放到第三个整型数组当中(引进动态数组)
  5. 输出结果

第一:我们引进两串数字

char num1[102];
char num2[102];
scanf("%s", num1);
scanf("%s", num2);

第二:将每一位数字逆序存放整型数组

 int la,lb,lc;int a[2001]={0};int b[2001]={0};int c[2001]={0};//这是待会儿要存答案的数组la=strlen(num1);//取第一个字符串的长度lb=strlen(num2);//取第二个字符串的长度for(int i=0;i<la;i++){//这里我们用la-i-1来实现逆序存放,将num数组的逆序存放在数组a中:即数字的个位存放在a【0】以此类推a[la-i-1]=num1[i]-'0';//通过ASCII码的运算,将字符数字转成整型数字}for(int i=0;i<lb;i++){b[lb-i-1]=num2[i]-'0';}lc=la+lb;//记录两个字符串的总长度

第三:进行计算并处理进位

for(int i=0;i<la;i++){for(int j=0;j<lb;j++){c[i+j]+=a[i]*b[j];c[i+j+1]+=c[i+j]/10;c[i+j]%=10;}}

想必大家不知道这算法公式是怎样推导出来的吧,那就让我针对推导过程进行讲解吧!


第四:将结果存放到第三个整型数组当中(引进动态数组)

while(c[lc]==0&&lc>0)lc--;char *re=(char *)malloc(sizeof(char)*(lc+2));for(int i=lc;i>=0;i--){re[lc-i]=c[i]+'0';}re[lc+1]=0;

4.1
没错,这里又出现了一个特别的while语句
while(c[lc]==0&&lc>0)lc–
它的作用是:比较大众的说法是删去前导零,不过这里有个小插曲,就是笔者在阅读其他作者的文章的时候并不能理解前导零是怎么产生的(没错就是这么傻 ),所以在这里我有另一种较为容易理解的说法。
还记得我们前面定义了两个字符串的长度和lc吗?
想想我们有两种情况:
1.在最高位有进位,那么这是存答案的数组就会往前再储存一位数字,存在c【lc】中(想想为什么)
2.在最高位没有进位,那么我们在初始化的时候就已经把c【lc】置为0了,那么我们就要将总长度lc(总位数)减掉,避免输出的时候在答案前面多了个0
4.2
这里我们引入动态数组的原因是笔者是用函数写的这部分运算,因此在函数结束时,函数会销毁,导致我们不能正常输出结果,因此需要另外开一个动态数组来存放我们的结果。
4.3:
有没有注意到 re[lc+1]=0,它可是至关重要的一步
笔者因为漏了它导致作业一直没能满分,因为内存的问题QAQ
它能够让我们在输出结果的时候及时地终止程序的读取,为什么呢?因为字符串在输出的时候只有读取到’\0’的时候才会终止,那么我们加上这句之后就是要让它在答案结尾处就终止输出,能避免不断输出而引起的内存出错哦!

第五:输出
没啥好讲的其实hhhhh

2.完整代码

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* multiply(char* num1, char* num2)
{int la,lb,lc;int a[2001]={0};int b[2001]={0};int c[2001]={0};la=strlen(num1);lb=strlen(num2);for(int i=0;i<la;i++){a[la-i-1]=num1[i]-'0';}for(int i=0;i<lb;i++){b[lb-i-1]=num2[i]-'0';}lc=la+lb;for(int i=0;i<la;i++){for(int j=0;j<lb;j++){c[i+j]+=a[i]*b[j];c[i+j+1]+=c[i+j]/10;c[i+j]%=10;}}while(c[lc]==0&&lc>0)lc--;char *re=(char *)malloc(sizeof(char)*(lc+2));for(int i=lc;i>=0;i--){re[lc-i]=c[i]+'0';}re[lc+1]=0;return re;
}
int main(){char num1[102];char num2[102];scanf("%s", num1);scanf("%s", num2);char* num = multiply(num1, num2);printf("%s", num);free(num);return 0;
}

三、总结

希望这篇文章能够帮助到所有正在学习程序设计的朋友们,如果对这篇文章有任何问题的欢迎在评论区留言,笔者会一一回复的,也恳请大家多多提出建议,让我们的博客越来越好。
如果觉得这篇文章不错的话,不要忘记点个赞哦!

【基础】(C语言)高精度算法相关推荐

  1. c语言高精度算法(加法)

    1.为什么使用高精度算法啊? 在c语言中,int类型取值范围为(-2^31 ~ 2^31-1),而long long类型取值范围也才仅有(-2^63~ 2^63-1),在处理一些较大的数据时,显然仅靠 ...

  2. c语言高精度算法阶乘_学了这么久的C语言,原来可以这样解决算法问题...

    C语言中有有许多经典的算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的.更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础. ...

  3. c语言高精度算法阶乘_任意位数的高精度阶乘算法 C语言版

    文章作者:姜南(Slyar)文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作. 今天就研究这个"任意位数的高精度阶乘算法"了,通过和大三的一个学 ...

  4. 语言高精度算法阶乘_JavaScript中的算法(附10道面试常见算法题解决方法和思路)...

    https://juejin.im/post/6844903811505455118 Introduction 面试过程通常从最初的电话面试开始,然后是现场面试,检查编程技能和文化契合度.几乎毫无例外 ...

  5. 猴子偷桃c语言编程软件,c语言经典算法——猴子偷桃问题

    题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿 ...

  6. 高精度阶乘和 高精度算法(c语言)

    以前刷oj的时候 遇见一个题目 也就是输入一个数字 判断阶乘和 用高精度计算出S=1!+2!+3!+-+N!(N≤50),其中"!"表示阶乘, 例如:5!=5*4*3*2*1.输入 ...

  7. c语言选择排序法程序设计,C语言基础之选择排序算法和代码

    在利用C语言进行编写程序的过程中,我们会常常通过算法及其代码来进行相关程序的编写工作.今天课课家笔者先给大家介绍C语言算法中的选择排序算法以及代码.那么到底什么是选择排序算法呢?下面由笔者慢慢道来. ...

  8. C语言常用算法 脚本之家,C/C++常用算法手册 秦姣华 中文pdf扫描版 22.5MB

    <C/C++常用算法手册>分3篇,共13章,"第1篇算法基础篇"介绍了算法概述,重点分析了数据结构和基本算法思想:"第2篇算法基本应用篇"详细讲解了 ...

  9. 动图图解C语言插入排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

最新文章

  1. 云计算赋能人工智能,未来的红利在哪?
  2. 三十七、页面置换算法
  3. 字符串中统计单词个数
  4. 笔记 - AliCloud 云数据库 简介
  5. Jquery实现点击页面发送弹幕效果
  6. ccxt k线数据_机器学习系列:深度探秘K线结构新维度
  7. 使用Java API的5个技巧
  8. java pg数据库事务回滚_PG 事务提交与回滚
  9. 中国结肠镜设备行业市场供需与战略研究报告
  10. SPSS Statistics 24 软件安装教程
  11. php 集成 spss,spss怎么录入数据
  12. 服务器先装系统还是先做热备,安装ibm服务器双机热备操作系统图文详细步骤.doc...
  13. 如何在AI时代验证您的IT职业生涯
  14. java连接jpi方式_Java数据库连接(Java Database Connectivity)
  15. 使用python绘制函数曲线
  16. PS纳米纤维膜 聚苯乙烯 纤维直径500-2000nm
  17. [Python] python 破解Excel密码(还原工作表密码)
  18. 主成分分析(Principal Component Analysis,PCA)
  19. XX大学学生选课系统需求规格说明书
  20. 2.6 修饰符的位置

热门文章

  1. 亿美软通史东旭:5G消息热潮下的安全冷思考丨5GMASSAGING · 上海站预告
  2. 免费下载谷歌地球高清卫星影像和高程DEM教程
  3. iptables ip 白名单操作
  4. Wine零知识学习1 —— 介绍
  5. Android之人品计算器教程
  6. 计算机睡眠状态单机游戏,睡眠神经图 电脑版
  7. [Unity] 制作游戏 赛车小游戏
  8. 戴尔新品移动工作站precision3541拆机图
  9. 英语读书笔记-Book Lovers Day 04
  10. 美式台球国标规则细解