Java 作为字符串的数字乘法

Java 作为字符串的数字乘法,java,Java,为什么从n1.charAt(i)和n2.charAt(j)中减去'0' 问题:给定两个以字符串表示的数字,返回以字符串表示的数字乘法 public String multiply(String num1, String num2) { String n1 = new StringBuilder(num1).reverse().toString(); String n2 = new StringBuilder(num2).reverse().toString(); int

为什么从
n1.charAt(i)
n2.charAt(j)
中减去
'0'

问题:给定两个以字符串表示的数字,返回以字符串表示的数字乘法

public String multiply(String num1, String num2) {
    String n1 = new StringBuilder(num1).reverse().toString();
    String n2 = new StringBuilder(num2).reverse().toString();

    int[] d = new int[num1.length()+num2.length()];

    //multiply each digit and sum at the corresponding positions
    for(int i=0; i<n1.length(); i++){
        for(int j=0; j<n2.length(); j++){
            d[i+j] += (n1.charAt(i)-'0') * (n2.charAt(j)-'0');
        }
    }

    StringBuilder sb = new StringBuilder();

    //calculate each digit
    for(int i=0; i<d.length; i++){
        int mod = d[i]%10;
        int carry = d[i]/10;
        if(i+1<d.length){
            d[i+1] += carry;
        }
        sb.insert(0, mod);
    }

    //remove front 0's
    while(sb.charAt(0) == '0' && sb.length()> 1){
        sb.deleteCharAt(0);
    }

    return sb.toString();
}
公共字符串乘法(字符串num1、字符串num2){
字符串n1=新的StringBuilder(num1).reverse().toString();
字符串n2=新的StringBuilder(num2).reverse().toString();
int[]d=新的int[num1.length()+num2.length()];
//将每个数字相乘,并在相应位置求和

for(int i=0;i从包含数字的字符中减去“0”可以得到该字符的数值

例如,“9”-“0”给出整数9

原因是数字字符('0'到'9')具有48到57之间的整数值,因此'9'-'0'相当于57-48,即9

为什么从n1.字符(i)和n2.字符(j)中减去“0”

因为表示数字0的Unicode字符的数字是48,而不是0

假设您想标记'A'=>0,'B'=>1等等,然后您会使用

n1.charAt(i) - 'A'
等等…但实际上,我们想要'0'=>0,'1'=>1等等,所以我们减去'0'。你需要区分“值,作为
int
”和“字符,作为
char
”(后者仍然有一个数值,但它不是你期望的值)。

它正在计算(通过减法)字符的数值。字符常量<代码> 0 /代码>也是数字<代码> 0 < /代码>。考虑<代码> char < /代码>值“0”到“9”的循环也可以作为<代码> int <代码> >

for (char ch = '0'; ch <= '9'; ch++) {
    System.out.print(ch);
    System.out.print(" = " );
    System.out.println((int) ch);
}
另请参见以指定的基数返回字符
ch
的数值。这意味着您可以替换

d[i + j] += (n1.charAt(i) - '0') * (n2.charAt(j) - '0');

d[i + j] += Character.digit(n1.charAt(i), 10)
    * Character.digit(n2.charAt(j), 10);
当然,该方法可以通过调用Java内置的任意精度类型
biginger
来实现,您可以使用


当字符存储在整数中时,它将转换为相应的
ASCII
存储值

现在,ASCII值为:

'0' (zero as character) is -> 48   
'1' (one as character ) is -> 49
 ......................
 and so on...
现在,我们如何从字符中得到整数


很容易从所有数字字符中减去
48
,这是
'0'

的ASCII码。试试这些:
System.out.println((int)'0');
System.out.println((int)'3');
,你就会明白了
d[i + j] += Character.digit(n1.charAt(i), 10)
    * Character.digit(n2.charAt(j), 10);
return new BigInteger(num1).multiply(new BigInteger(num2)).toString();
'0' (zero as character) is -> 48   
'1' (one as character ) is -> 49
 ......................
 and so on...