大数加法,大数乘法java版(高频面试题)
大数加法
public class Add { public static String addStrings(String num1, String num2){ int len1=num1.length()-1,len2=num2.length()-1; StringBuilder sb=new StringBuilder(); int carry=0; while(len1>=0||len2>=0||carry!=0){ int a=len1>=0?num1.charAt(len1)-'0':0; int b=len2>=0?num2.charAt(len2)-'0':0; int sum=carry+a+b; sb.append(sum%10); carry=carry/10; len1--; len2--; } return sb.reverse().toString(); } public static void main(String[] args) { String s = addStrings("0", "0"); System.out.println(s); } }
大数乘法
主要思想:AB*CD=A*C (A*D+B*C) B*D,
如:53*34=15 (29) 12 三个位置的数从后向前完成进位,12即2 进1,29+1=30即0进3,3+15=18即8进1,得1802。
public static String multiply(String s1,String s2){ if(s1=="0"||s2=="0") return "0"; int len=s1.length()+s2.length(); int[] tmp=new int[len]; for(int i=0;i<s1.length();i++){ for(int j=0;j<s2.length();j++){ tmp[i+j+1]+=(s1.charAt(i)-'0')*(s2.charAt(j)-'0'); } } int carry=0; for(int i=len-1;i>=0;i--){ int sum=carry+tmp[i]; tmp[i]=sum%10; carry=sum/10; } int index=0; StringBuilder sb=new StringBuilder(); while(index<len&&tmp[index]==0) index++; for(int i=index;i<len;i++) sb.append(tmp[i]); return sb.toString(); } public static void main(String[] args) { String multiply = multiply("0", "0"); System.out.println(multiply); }