以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。
数据范围: 读入的数字大小满足
要求:空间复杂度
,时间复杂度
(假设m是n的长度)
public String solve (String s, String t) { // write code here StringBuilder res=new StringBuilder(); int ls=s.length() ,lt=t.length(); int[] nums=new int[ls+lt-1];// 代表后面几个0,m+n最多m+n-2个0,但是还有0个0 for(int i=0;i<ls;i++){ for(int j=0;j<lt;j++){ nums[i+j]+=(s.charAt(i)-'0')*(t.charAt(j)-'0'); // 注意是+= } } int sum=0; for(int i=nums.length-1;i>=0;i--){ sum+=nums[i]; res.append(sum%10); sum/=10; } while(sum>0){ res.append(sum%10); sum/=10; } return res.charAt(0)=='0'?"0":res.reverse().toString(); }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param s string字符串 第一个整数 * @param t string字符串 第二个整数 * @return string字符串 */ public String solve (String s, String t) { String result = ""; for (int idx = 0; idx < t.length(); idx++) { char ch = t.charAt(t.length() - 1 - idx); int val = Integer.valueOf(ch + ""); String str = multiply(s, val, idx); result = add(str, result); } return result; } public String multiply(String s, int t, int pow) { StringBuffer strBuf = new StringBuffer(); int[] carry = new int[s.length() + 2]; for (int idx = 0; idx < s.length(); idx++) { char ch = s.charAt(s.length() - 1 - idx); int val = Integer.valueOf(ch + ""); int res = t * val; res += carry[s.length() - idx - 1]; if (res < 10) { strBuf.append(res); } else { carry[s.length() - idx] = res / 10; strBuf.append(res % 10); } } String result = strBuf.reverse().toString(); for (int idx = 0; idx < pow; idx++) { result += "0"; } return result; } public String add(String self, String other) { StringBuffer strBuf = new StringBuffer(); int[] carry = new int[Math.max(self.length(), other.length()) + 1]; int min = Math.min(self.length(), other.length()); for (int idx = 0; idx < min; idx++) { char chSelf = self.substring(self.length() - min).charAt(min - 1 - idx); char chOther = other.substring(other.length() - min).charAt(min - 1 - idx); int valSelf = Integer.valueOf(chSelf + ""); int valOther = Integer.valueOf(chOther + ""); int res = valSelf + valOther; res += carry[idx]; if (res < 10) { strBuf.append(res); } else { carry[idx + 1] = res / 10; strBuf.append(res % 10); } } if (self.length() > other.length()) { for (int idx = min; idx < self.length(); idx++) { char chSelf = self.charAt(self.length() - 1 - idx); int valSelf = Integer.valueOf(chSelf + ""); int res = valSelf; res += carry[idx]; if (res < 10) { strBuf.append(res); } else { carry[idx + 1] = res / 10; strBuf.append(res % 10); } } if (carry[self.length()] > 0) { strBuf.append(carry[self.length()]); } } else { for (int idx = min; idx < other.length(); idx++) { char chOther = other.charAt(other.length() - 1 - idx); int valOther = Integer.valueOf(chOther + ""); int res = valOther; res += carry[idx]; if (res < 10) { strBuf.append(res); } else { carry[idx + 1] = res / 10; strBuf.append(res % 10); } } if (carry[other.length()] > 0) { strBuf.append(carry[other.length()]); } } String result = strBuf.reverse().toString(); return result; } }
public String solve (String s, String t) { // write code here if(s.equals("0") || t.equals("0")) return "0"; List<String> list = new ArrayList<>(); for(int i=t.length() - 1;i >= 0;i--){ String tmp = mul(t.charAt(i),s); for(int j=t.length() - 1;j > i;j--){ tmp += "0"; } list.add(tmp); } String res = ""; for(String k : list){ res = add(res,k); } return res; } public String mul(char ch,String s){ StringBuilder sb = new StringBuilder(); int c = 0; for(int i = s.length()-1 ; i >= 0;i --){ char t = s.charAt(i); int res = (t - '0') * (ch - '0') + c; c = res / 10; char a = (char)(res % 10 + '0'); sb.append(a); } if(c != 0) sb.append((char)(c+'0')); return sb.reverse().toString(); } public String add(String a,String b){ int c = 0; int i = a.length() - 1; int j = b.length() - 1; StringBuilder sb = new StringBuilder(); while(i >= 0 || j >=0){ int av = i < 0 ? 0 : a.charAt(i) - '0'; int bv = j < 0 ? 0 : b.charAt(j) - '0'; int res = av + bv + c; c = res / 10; char t = (char)(res % 10 + '0'); sb.append(t); i --; j --; } if(c != 0){ sb.append((char)(c + '0')); } return sb.reverse().toString(); }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param s string字符串 第一个整数 * @param t string字符串 第二个整数 * @return string字符串 */ public String solve (String s, String t) { // write code here if(t.equals("0")||s.equals("0"))return "0"; char[] s2c = s.toCharArray(); char[] t2c = t.toCharArray(); if (s2c.length > t2c.length) { return multiply(s2c, t2c); } else { return multiply(t2c, s2c); } } public String add(char[] s, char[] t) { StringBuilder sb = new StringBuilder(); int index = 0; int l = s.length - 1, r = t.length - 1; while (index != 0 || l >= 0 || r >= 0) { int t1 = l >= 0 ? s[l--] - '0' : 0; int t2 = r >= 0 ? t[r--] - '0' : 0; sb.append((t1 + t2 + index) % 10); index = (t1 + t2 + index) / 10; } return sb.reverse().toString(); } public String multiply(char[] s, char t, int i) { int r1 = t - '0'; int index = 0; int l = s.length - 1; StringBuilder sb = new StringBuilder(); while (l >= 0 || index != 0) { int t1 = l >= 0 ? s[l--] - '0':0; int t2 = t1 * r1 + index; sb.append(t2 % 10); index = t2 / 10; } sb = sb.reverse(); int temp = i; for (int j = 0; j < i; j++)sb.append('0'); return sb.toString(); } public String multiply(char[] s, char[] t) { String res = "0"; for (int j = 0; j < t.length; j++) { String temp = multiply(s, t[t.length - 1 - j], j); res = add(res.toCharArray(), temp.toCharArray()); } return res; } }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param s string字符串 第一个整数 * @param t string字符串 第二个整数 * @return string字符串 */ public String solve (String s, String t) { if("0".equals(s)||"0".equals(t)) return "0"; // write code here int len1 = s.length(); int len2 = t.length(); //s乘t结果长度不超过s.len+t.len int[] ans = new int[len1+len2+1]; int pre = 0; //从s低位开始遍历,分别与t各个位置相乘,将各个位置相乘的结果加入ans当中 for(int i = len1-1;i>=0;i--){ int l = Integer.parseInt(s.charAt(i)+""); //从小遍历t当中各个位置的数字与s相应位置相乘,填入ans对应位置 for(int j = len2-1;j>=0;j--){ int r = Integer.parseInt(t.charAt(j)+""); int num = l*r+pre+ans[len1-1-i+len2-1-j]; //当前位置的值加上乘积在当前位置的值 ans[len1-1-i+len2-1-j] = num%10; //当前位置的进位 pre = num/10; } //可能当前s的i位置乘完t后有进位,继续向后加 int index = 0; while(pre!=0){ int tt = ans[len1-1-i+len2+index]; ans[len1-1-i+len2+index] = (tt+pre)%10; pre = (tt+pre)/10; index++; } } //ans数组当中右边为高位,避免高位出现0所以找出高位非0的位置 int pos = len1+len2; while(pos>=0&&ans[pos--]==0){} StringBuilder sb = new StringBuilder(); //返回左边为高位的答案 for(int i = pos+1;i>=0;i--){ sb.append(ans[i]); } return sb.toString(); } }
public String solve (String s, String t) { // write code here if(s.equals("0") || t.equals("0")) return "0"; int list[] = new int[s.length() + t.length() - 1]; for(int i = s.length() - 1; i >= 0; i--) { for(int j = t.length() - 1; j >= 0; j--) { int cur = (s.charAt(i) - '0') * (t.charAt(j) - '0'); list[i + j] += cur; } } int res = 0; StringBuilder ans = new StringBuilder(); for(int i = list.length - 1; i >= 0; i--) { int cur = list[i] + res; res = cur / 10; ans.append(String.valueOf(cur % 10)); } if (res > 0) { ans.append(String.valueOf(res)); } return ans.reverse().toString(); }
public String solve (String s, String t) { if (s.equals("0") || t.equals("0")) {return "0";} int[] res = new int[s.length() + t.length()]; for (int i = s.length() - 1; i >= 0; i--) { for (int j = t.length() - 1; j >= 0; j--) { res[i + j +1] += (s.charAt(i) - '0') * (t.charAt(j) - '0'); } } String[] test = new String[s.length() + t.length()]; int jin = 0; for (int i = res.length -1; i >= 0; i--) { int temp = res[i] + jin; jin = temp / 10; test[i] = "" + temp % 10; } String result = ""; if (jin != 0 ) { result += jin; } if (!test[0].equals("0")) { result += test[0]; } for (int i = 1; i < test.length; i++) { result += test[i]; } return result; }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param s string字符串 第一个整数 * @param t string字符串 第二个整数 * @return string字符串 */ public String solve (String s, String t) { int lenS = s.length(), lenT = t.length(); if (lenS == 0 || lenT == 0) return null; // 将字符串转为整数数组 int[] arrS = new int[lenS], arrT = new int[lenT]; for (int i = 0; i < lenS; ++ i) arrS[i] = (s.charAt(i) - '0'); for (int i = 0; i < lenT; ++ i) arrT[i] = (t.charAt(i) - '0'); // 计算每位乘积的结果,存入数组 int[] arr = new int[lenS + lenT]; for (int i = 0; i < lenS; ++ i){ for (int j = 0; j < lenT; ++ j){ arr[i + j + 1] += arrS[i] * arrT[j]; } } // 得出最终的结果,从后向前处理每位的结果 StringBuffer res = new StringBuffer(); int carry = 0; for (int i = lenS + lenT - 1; i > 0; -- i){ int num = arr[i] + carry; res.insert(0,num % 10); carry = num / 10; } if (carry > 0) res.insert(0, carry); return res.toString(); } }// 方法一:不转为整数,直接处理字符串 public String solve (String s, String t) { // 计算2个整数的乘积 int n1 = s.length(), n2 = t.length(); if (n1 == 0 || n2 == 0) return null; String[] arr = new String[n2]; // 进位 int count = 0; // 计算每位相乘的结果,翻转后,放入数组中 for (int i = 0; i < n2; ++ i){ StringBuffer sb = new StringBuffer(); int num = t.charAt(n2-1-i) - '0'; for (int j = n1-1; j >= 0; -- j){ int temp = num * (s.charAt(j) - '0') + count; sb.append(temp % 10); count = temp / 10; } if (count > 0) sb.append(count); count = 0; // 放入数组之前,先左移 i位 int k = i; while (k > 0) { sb.insert(0, '0'); -- k; } arr[i] = sb.toString(); } // 将数组中,每位相乘的结果相加,得出最终结果 StringBuffer res = new StringBuffer(); int n = arr.length; int m = arr[n-1].length(); count = 0; for (int i = 0; i < m; ++ i){ int num = 0; for (int j = 0; j < n; ++ j){ if (i >= arr[j].length()) continue; num += arr[j].charAt(i) - '0'; } num += count; res.insert(0,num % 10); count = num / 10; } if (count > 0) res.append(count); return res.toString(); }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param s string字符串 第一个整数 * @param t string字符串 第二个整数 * @return string字符串 */ public static String solve(String s, String t) { int sl = s.length(); int tl = t.length(); int[] ints = new int[sl + tl]; ArrayList<Integer> res = new ArrayList<>(); int k = 0; for (int i = sl - 1; i >= 0; i--) { k = sl - i - 1; for (int j = tl - 1; j >= 0; j--) { ints[k] += (s.charAt(i) - '0') * (t.charAt(j) - '0'); k++; } } for (int i = 0; i < ints.length; i++) { if (ints[i] > 9) { ints[i + 1] += (ints[i] / 10); ints[i] = ints[i] % 10; } } String result = ""; for (int i = ints.length - 1; i >= 0; i--) { result += ints[i]; } String substring = "0"; for (int j = 0; j < result.length(); j++) { if (result.charAt(j) != '0') { substring = result.substring(j, result.length()); break; } } return substring; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param s string字符串 第一个整数 * @param t string字符串 第二个整数 * @return string字符串 */ public String solve (String s, String t) { // write code here if(s.equals("0") || t.equals("0")) return "0"; int carry = 0; int index = 0; // 记录计算乘法时,层数 Deque<String> cache = new ArrayDeque<String>(); for(int i=s.length()-1;i>=0;i--){ int a = s.charAt(i)-'0'; String temp = ""; for(int j=t.length()-1;j>=0;j--){ int b = t.charAt(j)-'0'; temp = (a*b+carry)%10+temp; carry = (a*b+carry)/10; } int zeroNum = index; while(zeroNum-- > 0){ temp += "0"; } temp = carry!=0?carry + temp : temp; carry = 0; cache.offer(temp); index++; } // 将cache中的所有数加起来,按照大数加法的方式 return BigNumberAdd(cache); } public String BigNumberAdd(Deque<String> numbers){ while(numbers.size()>1){ String first = numbers.poll(); String second = numbers.poll(); String ans = GetNumber(first, second); numbers.offer(ans); } return numbers.poll(); } public String GetNumber(String num1, String num2) { int i = num1.length() - 1, j = num2.length() - 1, add = 0; StringBuffer ans = new StringBuffer(); while (i >= 0 || j >= 0 || add != 0) { int x = i >= 0 ? num1.charAt(i) - '0' : 0; int y = j >= 0 ? num2.charAt(j) - '0' : 0; int result = x + y + add; ans.append(result % 10); add = result / 10; i--; j--; } // 计算完以后的答案需要翻转过来 ans.reverse(); return ans.toString(); } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param s string字符串 第一个整数 * @param t string字符串 第二个整数 * @return string字符串 * 思路:一个作为乘数,一个作为被乘数,然后从最后一位 */ public String solve (String s, String t) { // write code here // 使用乘法法则,得到t的每一位乘以s得到的数字字符串 List<String> res = new ArrayList<>(); int cur = 0; int carry = 0; for(int i=t.length()-1;i>=0;i--){ StringBuilder sb = new StringBuilder(); int numA = t.charAt(i)-'0'; for(int j=s.length()-1;j>=0;j--){ int numB = s.charAt(j)-'0'; int sum = numA*numB+carry; cur = sum%10; carry = sum/10; sb.append(cur); } if(carry!=0){ sb.append(carry); } sb = sb.reverse(); // 拼接0 for(int k=0;k<t.length()-1-i;k++){ sb.append(0); } // 添加进入列表 res.add(sb.toString()); // cur,carray设置为初始值 cur = 0; carry = 0; } // 归并排序,进行数字的两两相加 return divide(res,0,res.size()-1); } public String divide(List<String> res,int left,int right){ if(left == right){ return res.get(left); } int mid = (left+right)/2; String s1 = divide(res,left,mid); String s2 = divide(res,mid+1,right); return mergeInto(s1,s2); } public String mergeInto(String s1,String s2){ int cur = 0; int carry = 0; int i = s1.length()-1; int j = s2.length()-1; StringBuilder sb = new StringBuilder(); while(i>=0 || j>=0){ int numA = i>=0?s1.charAt(i)-'0':0; int numB = j>=0?s2.charAt(j)-'0':0; int sum = numA+numB+carry; cur = sum%10; carry = sum/10; sb.append(cur); i--; j--; } if(carry!=0){ sb.append(carry); } return sb.reverse().toString(); } }
import java.util.*; public class Solution { public String solve (String s, String t) { //将字符串转化为数组形式 int len1=s.length(),len2=t.length(); int[] a1=new int[len1]; for(int i=0;i<len1;i++)a1[i]=s.charAt(i)-'0'; int[] a2=new int[len2]; for(int i=0;i<len2;i++)a2[i]=t.charAt(i)-'0'; // 开辟结果数组,结果长度至多为 lenOne + lenTwo int[] tmp=new int[len1+len2]; // 开始计算,先不考虑进位,每次结果存在result[i + j + 1]位置 // 为什么是i + j + 1? // 因为结果数组计算处理高位在数组左,低位在数组右。 //i+j+1实际上是往低位存,这样后面进位处理才正确 for(int i=0;i<len1;i++){ for(int j=0;j<len2;j++){ tmp[i+j+1]+=a1[i]*a2[j]; } } //进位 int carry=0; for(int i=len1+len2-1;i>=0;i--){ tmp[i]=tmp[i]+carry; carry=tmp[i]/10; tmp[i]=tmp[i]%10; } // 转为String,需要无视前置0 StringBuilder res=new StringBuilder(); int cur=0; while(cur<len1+len2&&tmp[cur]==0)cur++; //添加 for(int i=cur;i<len1+len2;i++)res.append(tmp[i]); //如果最终res长度为0,则代表输入类似"0" "0"的用例,结果应该输出“0” return res.length()==0?"0":res.toString(); } }
import java.util.*; public class Solution { public String solve(String s, String t) { // write code here int index = s.length() + t.length(); int[] res = new int[index + 1]; for(int i = s.length() - 1; i >= 0; i--){ int tempS = s.charAt(i) - '0'; // 获取每一位 int in = 0; for(int j = t.length() - 1; j >= 0; j--){ int tempT = t.charAt(j) - '0'; res[index - in++] += tempS * tempT; // 临时保存每一位相乘的结果 } index--; } for(int i = s.length() + t.length(); i > 0; i--){ // 处理每一位中大于个位数的情况 int temp = res[i] / 10; res[i] %= 10; res[i - 1] += temp; } boolean start = false; StringBuilder resStr = new StringBuilder(); for(int i = 0; i <= s.length() + t.length(); i++){ // 拼接,处理前导0 if(start || res[i] != 0){ start = true; resStr.append(res[i]); } } return resStr.length() > 0 ? resStr.toString() : "0"; } }