大数加法,大数乘法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);
}
