大数相乘(c语言/c++)

  • 方法一:做加法
  • 方法二、做乘法

方法一:做加法

思路:模拟竖乘过程。将num2从后往前一个一个的去乘num1.然后累加。在累加的时候记得在末尾补0.补的0的个数就是第二个字符串中当前i与长度-1的距离。

代码:

string multiply(string num1, string num2) {if(num1=="0"||num2=="0") //其中有一个为0就直接返回0了return "0";string ans = "0";int n = num1.size(), m = num2.size();for(int i=m-1;i>=0;--i) //遍历字符串2中的每一位{string cur; //用来记录当前字符乘num1所得的字符串int add = 0; //进位for (int j = m - 1; j > i; j--) {  cur.push_back(0);  // 末尾补上0}int y = num2.at(i) - '0'; //转化为整数for(int j=n-1;j>=0;--j){int x = num1.at(j) - '0';int product = x * y + add; //相乘结果cur.push_back(product%10); //取余add = product/10;  //进位}if(add!=0) //不等于0表明在相乘后位数加1了{    cur.push_back(add%10);add /=10;}reverse(cur.begin(),cur.end());//转过来,因为之前是个位数在前for(auto &ch:cur) //转化为字符串,&表示引用ch += '0';ans = addStrings(ans,cur); //累加}return ans;    }
// 大数相加string addStrings(string &num1, string &num2) {int i = num1.size() - 1, j = num2.size() - 1, add = 0;string ans;while (i >= 0 || j >= 0 || add != 0) {int x = i >= 0 ? num1.at(i) - '0' : 0;int y = j >= 0 ? num2.at(j) - '0' : 0;int result = x + y + add;ans.push_back(result % 10);add = result / 10;i--;j--;}reverse(ans.begin(), ans.end());for (auto &c: ans) {c += '0';}return ans;}

大数相加可以加这边博文解释:
大数相加

方法二、做乘法

明确两点:

  1. 令 m 和 n 分别表示num1和num2的长度,并且它们均不为 0,则 num 1
    和 num2的乘积的长度为m+n−1 m+n。
  2. 对于任意 0≤i<m 和 0≤j<n,num [i]×num 2[j] 的结果位于ansArr[i+j+1]。

代码:

 string multiply(string num1, string num2) {int n = num1.size(),m = num2.size();if(num1=="0"||num2=="0")return "0";vector<int>ans(m+n,0);for(int i=m-1;i>=0;--i){int y = num2[i] - '0';for(int j=n-1;j>=0;--j){int x = num1[j] - '0';ans[i+j+1] +=x*y; //将相乘结果放到数组中}}//进位,按上面的,位数高的是在数组前边,所以从后边开始进位for(int i=n+m-1;i>0;i--){// 这里也可以不用判断,因为如果不大于10的话/10 得到的是0if(ans[i]>=10) //大于10的话,往前进位{ans[i-1] +=ans[i]/10;ans[i] %=10;}}//看第一位是否大于0,判断字符起始的位置int index = ans[0] >0?0:1;string res;for(int i=index;i<n+m;++i)res.push_back(ans[i]+'0');return res;}

大数相乘(c语言/c++)相关推荐

  1. 高效大数乘法 c语言,华为2012校园招聘上机题——大数相乘,两个超过100位的大数相乘C语言...

    这是我调试时间最长的程序,整整弄了两天才弄好,不过还有点数组下标越界的小问题没解决!但是结果是正确的! 算法思想:将两个相乘的数分别放在两个数组中,之后用一个数,逐位的乘以另一个数,在将乘积的和放在另 ...

  2. 面试官让你用C语言实现大数相乘,慌吗?

    在之前的笔试题解析里面,我写了大数相加的问题,这里再剖析一个大数相乘,顾名思义,大数相乘就是这个数已经大到最大的数据类型都没有办法保存了. 我们看看最大的数据类型可以保存多大的数据. #include ...

  3. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

  4. C语言大数相乘(整形)

    C语言大数相乘(整形) 我们在用C语言运算时int存不下很大的数字无法直接计算大数相乘,那么这时候就需要把数字当作字符先存下来,然后存入数组中一部分一部分的进行运算.我通过-纸短情长大佬的这篇博客理解 ...

  5. c语言实现大数相乘,最简单的C语言实现大数相乘

    前言 : 实现大数相乘比相加要难一点 , 但是仔细分析会发现很多共同之处 分析 : 1. 由数学归纳法会发现用一般的两数相乘方法计算 , 每计算一次都能够确定最终结果的一位数字 2. 比如说 : 45 ...

  6. c语言中大数相乘的方法,C++实现大数相乘算法

    本文实例为大家分享了C++实现大数相乘的具体代码,供大家参考,具体内容如下 首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘 ...

  7. 大数相乘(C语言,分治算法)

    问题: 由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算.大数运算主要有加.减.乘三种方法. 下面就 ...

  8. C语言实现大数相乘(思路+代码+运行结果)

    大数相乘 思路: 1.先将字符串倒序并转换为数字 2.逐位相乘,并存入一个数组e[i+j]中 3.处理进位,并消去多余的0 4.转换并把数组e[i]反转输出 #include<stdio.h&g ...

  9. 大数相乘、大数相加、大数相减Java版本

    为什么80%的码农都做不了架构师?>>>    题目:两个非常大的数字相乘(相加,相减) 该题目在java中可以使用BigInteger类中的方法来实现.否则的话可以使用如下方式来实 ...

最新文章

  1. 黄皓之后,计算机科学上帝Don Knuth仅用一页纸证明布尔函数敏感度猜想
  2. 学术新星畅谈计算机视觉科研之路:视觉研究已经成熟,跨学科方法成为趋势...
  3. 日赚 5 亿的腾讯工资又涨了:员工上半年人均月薪 7.8 万
  4. 安卓摄像头 data 转bitmap
  5. 【Hadoop】HDFS客户端开发示例
  6. 子窗口关闭,父窗口有选择刷新
  7. mysql百万级分页优化
  8. 2、MySQL使用(DISTINCT)过滤重复数据
  9. STC12C5A60S2笔记8(串口)
  10. 小程序 --- Tab组件的封装
  11. Uber宣布停止无人卡车项目,研发重心将转向无人小汽车
  12. iStack详解(三)——iStack多主检测方式
  13. arduino串口绘图_写了一个串口实时曲线绘制软件,分享给大家。不好轻拍
  14. 十五届恩智浦智能车杀青
  15. ssm+vue基于微信小程序的数学辅导教学学习系统#毕业设计
  16. 细说.NET中的多线程 (六 使用MemoryBarrier,Volatile进行同步)
  17. java微信主动推送消息_利用java开发微信实现微信主动推送消息实例
  18. ffmpeg视频添加meta信息
  19. python 求定积分
  20. 《响应式Web设计性能优化》一2.3 Web运行时性能

热门文章

  1. 圆柱体积怎么算立方公式_【六年级数学微课】巧算圆锥的体积
  2. 编译器编译报错时aka是什么意思?(also known as)
  3. Intel Realsense D435 管道配置文件类(pipeline_profile)与流配置文件类(config)
  4. Intel RealSense D435摄像头被识别成D430的解决办法
  5. Java使用BTrace动态替换线上class文件
  6. nuxt服务端php,nuxt服务端部署指南
  7. Redis 的缓存异常处理 —— 缓存雪崩、缓存击穿、缓存穿透
  8. ffmpeg 添加水印LOGO
  9. springboot打包发布
  10. java控制台计算数字_java从控制台接收一个数字