【leetcode】43. (Medium)Multiply Strings

本文详细解析了如何通过算法实现两个大整数的字符串乘法,包括构建二维数组计算乘积、进位处理及结果转换过程。

题目链接


解题思路:
这道题的意思就是就两个数的乘积,不过因数和积都是用字符串表示的。
基本框架是:http://www.cnblogs.com/TenosDoIt/p/3735309.html
在这里插入图片描述

我的思路是:
首先计算一个二维数组pros(products),分别计算出上图中黑色算式的数值;
这个二维数组中的每一排数字前面和后面都会有空缺,需要额外填补上,
比如说第一排数组其实是[0,0,16,64,72],第二排的数组其实[0,10,40,45,0]…
依次类推;
然后最初的结果是矩阵每一列的相加,加在res上,比如res的第一个元素值就是0+0+14=14,第二元素值是0+10+56=66…依次类推;
最后从res数组的最后一个一个一个向前加,加成每一位都是个位数的情况,
比如res最后一位是72,将70传给上一位,本位只剩2;res的倒数第二位109加上后一位传过来的7之后变成116,将110传给前一位,本位只剩6…依次类推;
然后再将数组结果转化为字符串。

提交代码:

class Solution {
    public String multiply(String num1, String num2) {
    	 if(num1.equals("0")||num2.equals("0"))    return "0";
         if(num1=="1")   return num2;
         if(num2=="1")   return num1;
    	
    	
        List<List<Integer>> pros=new ArrayList<List<Integer>>(); //products
        List<Integer> res=new ArrayList<Integer>();
        int zerocnt=Math.min(num1.length()-1, num2.length()-1);
        int cnt=0,sum=0;
        
        //长的因数在上面,短的因数在下面
        if(num1.length()<num2.length()) {
        	String tmp=num1;
        	num1=num2;
        	num2=tmp;
        }
        
        
        for(int i=num2.length()-1;i>=0;i--) {  //dimension1
        	List<Integer>	row=new ArrayList<Integer>();
			//添加每一排前面的空缺
        	for(int k=0;k<zerocnt-cnt;k++)
        		row.add(0);
        	
        	for(int j=0;j<num1.length();j++)   //d2
        		row.add(Num(num1.charAt(j))*Num(num2.charAt(i)));
        	//添加每一排后面的空缺
        	for(int k=0;k<cnt;k++)
        		row.add(0);
        	
        	
        	//System.out.println(row);
        	pros.add(row);
        	cnt++;
        }
        //System.out.println(pros);
        
        
        //calculate the pros
        for(int i=0;i<pros.get(0).size();i++) {	 //column
        		for(int j=0;j<pros.size();j++)
        			sum+=pros.get(j).get(i);
        		res.add(sum);
        		sum=0;
        	}
       // System.out.println(res);
        
        for(int i=res.size()-1;i>0;i--) {
        	if(res.get(i)>=10) {
        		res.set(i-1, res.get(i-1)+res.get(i)/10);
        		res.set(i,res.get(i)%10);
        	}
        	System.out.println(res);
        }
        if(res.get(0)>=10) {
        	int tmp=res.get(0);
        	res.add(0, tmp/10);
        	res.set(1, tmp%10);
        }
        System.out.println(res);
        
        String s=new String();
        for(int i=0;i<res.size();i++)
        s+=Integer.toString(res.get(i));
        
        System.out.println(s);
        
        return s;
    }
    
    public int Num(char c) {
    	return c-'0';
    	}
}

运行结果:
在这里插入图片描述

其他:
1.怎么向二维List中添加List:
List<List> d2=new ArrayList<List>(); //这是一位二维数组

for(int i=0;i<m;i++)
List d1=new List(); //这是一个新添加的一维数组
d2.add(d1);

1>就是每次添加的总是new的List();
2>一个一维数组被添加之后不能被删掉,就是不能:
for(int i=0;i<m;i++)
List d1=new List();
d2.add(d1);
d1.clear();

不然之前添加在d2中的那个d1也会被clear掉


2.重置ArrayList中某一个元素的值:
List list=new ArrayList();
list.set(0,3); //将list中的第0位置为3


3.将一个int型转为string:
String s= Integer.toString(7);


4.如果下面这段代码写成if(num1==“0”||num2==“0”) return “0”; OJ识别不出来,会判错

if(num1.equals(“0”)||num2.equals(“0”)) return “0”;

多源动态最优潮流的分布鲁棒优化方法(IEEE118节点)(Matlab代码实现)内容概要:本文介绍了基于Matlab代码实现的多源动态最优潮流的分布鲁棒优化方法,适用于IEEE118节点电力系统。该方法结合两阶段鲁棒模型与确定性模型,旨在应对电力系统中多源输入(如可再生能源)的不确定性,提升系统运行的安全性与经济性。文中详细阐述了分布鲁棒优化的建模思路,包括不确定性集合的构建、目标函数的设计以及约束条件的处理,并通过Matlab编程实现算法求解,提供了完整的仿真流程与结果分析。此外,文档还列举了大量相关电力系统优化研究案例,涵盖微电网调度、电动汽车集群并网、需求响应、储能配置等多个方向,展示了其在实际工程中的广泛应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事能源系统优化工作的工程师。; 使用场景及目标:①用于研究高比例可再生能源接入背景下电力系统的动态最优潮流问题;②支撑科研工作中对分布鲁棒优化模型的复现与改进;③为电力系统调度、规划及运行决策提供理论支持与仿真工具。; 阅读建议:建议读者结合提供的Matlab代码与IEEE118节点系统参数进行实操演练,深入理解分布鲁棒优化的建模逻辑与求解过程,同时可参考文中提及的其他优化案例拓展研究思路。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值