字符串之大数乘法

24 篇文章 0 订阅
订阅专栏

描述
以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。

数据范围: 读入的数字大小满足 0 \le n \le 10^{1000}0≤n≤10
1000

思路一:建议使用

就是平常我们做乘法的步骤,先相乘,再相加, 最后统一处理进位。

优化之后就是直接算乘法,把 num1 的每一位数字 和 num2 的每一位数字相乘, 相乘的结果放到对应的位置上,最后我们再处理相乘之后的结果即可。

如果 num1 的长度为 N , num2 的长度为 M, 则 num1 * num2 的结果最长长度为 N + M,所以开辟一个长度为 N + M 的整型数组来操作相乘的结果。

在这里插入图片描述

最后处理进位:

在这里插入图片描述


package test;

public class BigCheng4 {
    public static void main(String[] args) {
        BigCheng4 bigCheng4 = new BigCheng4();
        String solve = bigCheng4.solve("12", "999");//96726
        System.out.println(solve);
    }
    public String solve(String s, String t) {
        //1.判断空
        if(s.length()==0 || t.length()==0)
            return "0";
        if("0".equals(s)||"0".equals(t))
            return "0";
        //用于存最后结果的整型数组
        int res[]=new int[s.length()+t.length()];
        //2.处理乘法和累加计算
        for (int i = s.length()-1; i >=0 ; i--) {
            for (int j = t.length()-1; j >=0 ; j--) {
                res[i+j+1] = res[i+j+1]+
                        (s.charAt(i)-'0')*(t.charAt(j)-'0');
            }
        }
        /**
         * 测试数组累加结果
         *  for (int re : res) {
         *             System.out.print(re+ "  ");
         * }
         */
        //3.处理最后的进位
        int carry=0;
        StringBuffer buffer = new StringBuffer();
        for (int i = res.length-1; i >=0 ; i--) {
            //先加数
            int curRes = res[i]+carry;
            buffer.append(curRes % 10);//将个位数串起来
            carry=curRes/10;

        }
        String s1 = buffer.reverse().toString();
        //System.out.println(s1);,
         //去掉多于的前面的0
        if(s1.charAt(0)=='0'){
            return s1.substring(1);
        }else{
            return s1;
        }

    }
}


思路二:数学模拟法

在这里插入图片描述

代码演示:
思路相当于2轮循环:第一轮相当于123x5=615
第二轮相当于123x40 = 4920

然后相加两轮结果即可;

package test;

public class BigCheng2 {
    public static void main(String[] args) {
        BigCheng2 bigCheng2 = new BigCheng2();
        String solve = bigCheng2.solve("123", "45");
        System.out.println(solve);

    }
    public static String solve (String s, String t) {
        //判空
        if(s.length()==0 || t.length() == 0)
            return "0";
        if("0".equals(s) || "0".equals(t))
            return "0";

        //字符串进行反转操作
        StringBuffer reverse_s = new StringBuffer(s).reverse();
        StringBuffer reverse_t = new StringBuffer(t).reverse();
        //找出段字符串进行外层循环
        StringBuffer shortStr =
         reverse_s.length()<reverse_t.length()?reverse_s:reverse_t;
         
        StringBuffer longStr = 
        reverse_s.length()>=reverse_t.length()?reverse_s:reverse_t;
        //开始循环计算结果
        int res[] = new int[s.length()+t.length()];//存放结果
        int up = 0;//开始的进位
        for (int i = 0; i < shortStr.length(); i++) {
            int k = i;//k每一次循环进行累加,相当于下标计数器,
            up = 0;//每一轮进位重置为0
            for (int j = 0; j < longStr.length(); j++) {
                //临时的一个数字相乘的结果+进位+原先数组的结果
                int curRes =
                 (shortStr.charAt(i)-'0')*(longStr.charAt(j)-'0')+up+res[k];
                //求进位和当前位置数res[k]
                res[k] = curRes % 10;
                up = curRes /10;
                k++;//下标增加
            }
            //一轮计算完毕后,再向前一位计算进位,防止有进位的
            res[k] = res[k]+ up;
        }
        //统计结果,并反转
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < res.length; i++) {
            buffer.append(res[i]);
        }
        String s1 = buffer.reverse().toString();
        if(s1.charAt(0)=='0'){
            return s1.substring(1);
        }else{
            return s1;
        }

    }
}

字符串相乘——大整数乘法
菜鸟日常
07-10 1501
概述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 输入: num1 = “2”, num2 = “3” 输出: “6” 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/multiply-strings 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 思路 常规思路: 1234 * 456 = 1234 * 6 + 1234 * 50 + 1234
大数乘法字符串实现大数乘法
05-23
大数乘法字符串实现大数乘法,大整数乘法,用string类实现
[LeetCode] 字符串相乘
weixin_37992828的博客
11-25 147
给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。 示例 1: 输入: num1 = "2", num2 = "3" 输出: "6" 示例2: 输入: num1 = "123", num2 = "456" 输出: "56088" 说明: num1和num2的长度小于110。 num1 和num2 只包含...
LeetCode 43. 字符串相乘大数相乘
weixin_44530058的博客
07-30 547
在说大数相乘问题之前,我们先来看一下在算法竞赛中使用起来非常方便快捷的C++模板类vector 1. 不定长数组vector C语言在声明和定义一个数组时,必须要事先指定数组的长度,这就不利于数组中元素的动态增长,而C++引入了不定长数组vector,就能很好的解决这个问题,这也是vector受到广大acm竞赛选手青睐的原因所在。 vector是一个标准模板类,所以需要用vector A 或 vector B来声明一个vector,vector声明一个整数数组,而vector声明一个字符串数组。 vec
C语言之大数相乘
qq_62612545的博客
12-05 3241
大数运算其实就是利用字符串。 实现过程:分情况的。 第一种情况:两个乘数都是非0数: 1、先将你输入的字符串逆序转化为整型数组,逆序是为了方便后面的运算(就像我们数学中也是从最后面开始一样)。 2、再得到对应位的乘积(对齐的竖列)之和,这一步可以先不管进位,到最后再一起进位 3、解决了第二步,开始进位操作 进位其实就是数学内容,某一位的数字是不可能大于9的所以大于时就要向前进一位 4、最后把你得到的结果输出就行了 第二种情况: 当字符串等于“0”时,输出0; 上代码:..
【LeetCode43:字符串相乘大数相乘)(Java实现)】
NorthSmile的博客
10-23 999
字符串相乘大数相乘问题
Leetcode43. Multiply Strings字符串相乘大数相乘
Ha12312的博客
11-21 158
给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。 示例 1: 输入: num1 = "2", num2 = "3" 输出: "6" 示例2: 输入: num1 = "123", num2 = "456" 输出: "56088" 说明: num1和num2的...
大数问题:用字符串解决大数相加和相乘
07-02 558
在ACM的题目中经常会遇到大数相加和相乘的问题,在有些公司的面试题中也有暗含要用大数才能解决的问题。比如:输入三个整数,写一个程序判断这个三个整数能否构成一个直角三角形。此题算法很简单,但是却暗含着结果可能溢出的问题。如果不会用大数,此题就无法给出完美的答案。下面给出大数乘法和加法算法:1、加法:// assume m is bigger than n.char* add(c
字符串相乘大数相乘
qq_42060170的博客
02-27 279
问题: 给出两个字符串表示的正整数,求其乘积,返回其乘积的字符串表示。 思路: 用一个数组存储乘积,第i位与第j位的乘积累积保存到数组的第i+j+1位,后对数组每一位做进位操作。 java代码: public String multiply(String num1,String num2){ int len1=num1.length(),len2=num2.length(); ...
字符串表示 大数相乘
u012513234的专栏
10-23 511
void multiply_1(char number1[],char number2[]) {     int len1=0,len2=0; char *p1=number1,*p2=number2; while (*p1++) { len1++; } while (*p2++) { len2++; } p1=NULL; p2=NULL; cout for (int
字符串实现大数字的相乘相加以及求指数
04-28
当数字大到不能用long来表示的时候,我们可以用String来表示,这样相乘相加不受位数限制,同时可以用于求大指数,例如pow(2,1000)
基于字符串大数乘法
11-26
基于字符串大数乘法 有效解决大数乘法溢出的问题
Q714586 C语言大数乘法的运算
11-26
Q714586 C语言大数乘法的运算 https://ask.csdn.net/questions/714586
大数乘法
08-22
最大支持32767位数字与32767位数字相乘得到一个65534位数的结果
超大整数的乘法,用字符串实现
05-23
超大整数的乘法 字符串实现大数乘法 ,用c++的string类实现的,无位数限制,不损失精度,目前只支持整数
大数乘法-字符串相乘
凯撒袁六兽的blog
03-16 664
字符串乘法 引言: 有一些很大的数字相乘,乘出来的数字可能会超过我们所学的任意基本类型的范围,这个时候我们就可以用字符串去处理它,把它存放在字符串中。 思路: 1.暴力解决:直接把每一位拿出来乘,乘完再相加。 2.运用乘法原理:每一位的数字乘出来以后,再在相应的位上相加,最后再进位,将数组输出即可。 不难发现其中的关系,第一个是乘出来的数在数组中的位置等于两个原数组的下标和,第二个是在乘的时候是从...
43. 字符串相乘 大数相乘字符串相乘
Z_Y_D_的博客
02-25 384
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 示例 1: 输入: num1 = "2", num2 = "3" 输出: "6" 示例 2: 输入: num1 = "123", num2 = "456" 输出: "56088" 说明: num1 和 num2 的长度小于110。 num1 和
字符串大数乘法(包括浮点数)
Zk
04-22 6349
一.大数乘法 我们知道,要运算两个数的乘法,c、c++语言里有专门的运算符*。但是当两个数超过一定的范围时,用普通的运算符会产生溢出,并不能得到正确的结果。如何进行运算呢?       首先,要想保存一个大数,用正常的整形或浮点类型是不够的。所以我们可以采用字符串的形式对大数进行保存,然后编写算法,模拟乘法运算过程即可。 1.第一个问题:两个数字运算结果至多用多少位的字符串保存呢? 两个4
大数乘法_字符串
MLee 的博客
04-03 487
题目 逐位相乘进位法参考链接:http://www.cnblogs.com/heyonggang/p/3599857.html 链接:http://lx.lanqiao.cn/problem.page?gpid=T364  当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度
大数乘法代码
最新发布
05-24
以下是一个简单的大数乘法的代码实现(使用字符串存储大数): ```python def multiply(num1, num2): if num1 == "0" or num2 == "0": return "0" m, n = len(num1), len(num2) res = [0] * (m + n) # 存储计算...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • idea使用教程 62060
  • Linux安装MongoDB(简单详细) 23802
  • Redis哨兵模式(一主二从三哨兵) 21080
  • 生产者消费者模式三种实现方式 18612
  • 微信登录的接口 14507

分类专栏

  • 机械 41篇
  • 电工 2篇
  • 数据结构和算法 24篇
  • MongoDB 6篇
  • Redis 16篇
  • 面试 56篇
  • MQ 10篇
  • postman/swagger 4篇
  • maven 5篇
  • spring 21篇
  • Dubbo 1篇
  • Nginx 1篇
  • linux 18篇
  • javaweb 9篇
  • springboot 37篇
  • springcloud 33篇
  • mybatis-plus 4篇
  • mybatis 14篇
  • 错误总结 2篇
  • springmvc 10篇
  • spring注解开发和纯注解开发
  • 设计模式 3篇
  • Docker 2篇
  • javase 82篇
  • 多线程 35篇
  • spring-test 1篇
  • Idea 1篇
  • Git/Github 2篇
  • ajax 2篇

最新评论

  • Linux安装MongoDB(简单详细)

    百香熊猫果: 掉了一步,修改完/etc/profile 记得source /etc/profile是配置文件生效

  • String、StringBuffer与StringBuilder类详解

    拯救micheal计划: 同样是硅谷大学毕业,你为何如此优秀表情包

  • Redis持久化

    Gao__xi: 第一步:开启save配置,即打开save x x,也就是关闭RDB模式??不是很懂,开启save配置不是开启RDB吗?

  • Linux安装MongoDB(简单详细)

    可爱元气: 如果source完成还是报错呢

  • Linux安装部署Zookeeper

    呆瓜-hao: 我丢,这么长表情包

最新文章

  • 机械设计手册第一册:公差
  • 电脑重装系统的PE工具
  • 基恩士PLC-KV5500基础入门二
2024年17篇
2023年29篇
2022年118篇
2021年147篇
2020年45篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司茂名百度标王公司榆林seo优化报价济宁SEO按效果付费推荐铁岭营销型网站建设宿州百度标王长治品牌网站设计威海英文网站建设陇南网络推广百色网站优化报价阿里网站seo优化报价网站优化按天扣费报价东营外贸网站建设推荐池州网络推广推荐开封网站优化软件推荐白城推广网站推荐福州网站设计模板公司武威百度关键词包年推广推荐林芝SEO按天扣费凉山网站推广方案公司嘉兴关键词按天收费公司韶关网站推广工具兴安盟网站制作多少钱思茅品牌网站设计河源设计公司网站多少钱塔城网站优化推广价格开封阿里店铺托管价格安庆企业网站设计哪家好巢湖营销网站泰州网站优化按天扣费哪家好福州模板制作公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化