let43 Multiply String

2024-03-29 18:18
文章标签 string multiply let43

本文主要是介绍let43 Multiply String,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主题思想: 大数乘法, 这里写一种大数乘法的通用模板,整体思路是: 利用数组,一个int型数组表示长度为4的子串, 为什么是4呢? 因为int 型 21亿,1亿=10^9, 长度为4最大值9999,两个值相乘<10^8 ,结果仍可以用一个int表示。
大体思路如下,把字符串,按每四位截取,并转换成int 存储在数组里

运算时,对int数组进行运算,输出结果需要注意,去除前导0, 对于中间值为0的情况,要输出4个0.

代码:

class Solution {public String multiply(String num1, String num2) {if(num1==null||num1.length()==0) return "";if(num2==null||num2.length()==0) return "";int n=30;int[] arr1=new int[n];int[] arr2=new int [n];int [] sum=new int[2*n];for(int i=0;i<n;i++){arr1[i]=0;arr2[i]=0;}for(int i=0;i<2*n;i++)sum[i]=0;str2array(num1,arr1);str2array(num2,arr2);int carry=0;int tmp=0;for(int i=0;i<n;i++){carry=0;tmp=0;for(int j=0;j<n;j++){tmp=arr1[i]*arr2[j]+carry;sum[i+j]+=tmp;carry=sum[i+j]/10000;sum[i+j]=sum[i+j]%10000;}}String ans="";int start=2*n-1;for(int i=2*n-1;i>=0;i--){if(sum[i]!=0) {start=i;break;}}if(start==2*n-1) return "0";for(int j=start;j>=0;j--) {ans=ans+int2str(sum[j]);}start=0;for(int i=0;i<ans.length();i++){if(ans.charAt(i)!='0'){start=i;break;}}return ans.substring(start);}public void str2array(String num,int[] array){int len=(num.length()+3)/4;int tmp=0;for(int i=0;i<len;i++){tmp=num.length()-i*4;array[i]=str2int(num.substring(Math.max(tmp-4,0),tmp));}return ;}public int str2int(String str){int sum=0;for(int i=0;i<str.length();i++){sum=sum*10+(int)(str.charAt(i)-'0');}return sum;}public String int2str(int num){String s="";while(num!=0){s=(num%10)+s;num/=10;}int rawLen=s.length();for(int i=0;i<4-rawLen;i++){s="0"+s;}return s;}
}

这篇关于let43 Multiply String的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/859294

相关文章

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

hdu2072(string的应用)

单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25447    Accepted Submission(s): 5957 Problem Description lily的好朋友xiaoou333最近很空,他

【UVA】10739 - String to Palindrome(动态规划)

比较水的动态规划 dp[i][j] 将原串 i ~ j 之内的字符转化为回文字符所需要的最小操作次数 其中删除操作和添加操作本质上是一样的。 三个状态转移方程: dp[i][j] = min(dp[i][j] ,dp[i + 1][j]); dp[i][j] = min(dp[i][j] ,dp[i + 1][j - 1]); dp[i][j] = min(dp[i][j] ,dp[

理解String的compareTo()方法返回值

compareTo()的返回值是整型,它是先比较对应字符的大小(ASCII码顺序), 如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值。 如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符作比较, 以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度。 我们可以通过阅读源码加深对compareTo()的理解: comp

【JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

基本数据类型   JavaScript基本数据类型包括:undefined、null、number、boolean、string。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值。 1)基本数据类型的值是不可变的 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = "change";name.substr();//hangconsole.log

leetcode#541. Reverse String II

题目 Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of

Java中Map取值转String Null值处理

Map<String, Object> 直接取值转String String value = (String)map.get("key") 当map.get(“key”)为Null值时会报错。 使用String类的valueOf静态方法可以解决这个问题 String value = String.valueOf(map.get("key"))

Qt的QString和C++string之间的转换

QString qstr; string str; //将QString转化为C++的string str = qstr.toStdString(); //将C++的string转化为QString qstr = QString::fromStdString(str);

string类、string类的常用接口说明等的介绍

文章目录 前言一、 string类二、 string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作3. string类对象的访问及遍历操作4. string类对象的修改操作5. string类非成员函数 总结 前言 string类、string类的常用接口说明等的介绍 一、 string类 string是表示字符串的字符串类该类的