将数字乘以字符串

时间:2015-06-19 05:09:24

标签: java

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

问题:给定两个数字表示为字符串,将数字作为字符串返回乘法。

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();
}

4 个答案:

答案 0 :(得分:3)

计算(通过减法)字符的数值。字符常量0也是数字0。考虑一个char值&#39; 0&#39;到&#39; 9&#39;也可以int完成。

for (char ch = '0'; ch <= '9'; ch++) {
    System.out.print(ch);
    System.out.print(" = " );
    System.out.println((int) ch);
}

for (int ch = '0'; ch <= '9'; ch++) {
    System.out.print((char) ch);
    System.out.print(" = " );
    System.out.println(ch);
}

其中(两者)演示数字的ascii code(技术上是Unicdoe,但技术早于Unicode)

0 = 48
1 = 49
2 = 50
3 = 51
4 = 52
5 = 53
6 = 54
7 = 55
8 = 56
9 = 57

另请参阅Character.digit(char, int),它会在指定的基数中返回字符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内置的任意精度类型BigInteger来实现该方法,并且可以使用BigInteger.multiply(BigInteger)之类的

return new BigInteger(num1).multiply(new BigInteger(num2)).toString();

答案 1 :(得分:2)

从包含数字的字符中减去“0”,可以得到该字符的数值。

例如,'9' - '0'给出整数9。

原因是数字字符('0'到'9')的整数值从48到57,所以'9' - '0'相当于57 - 48,这给你9。 / p>

答案 2 :(得分:2)

  

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

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

想象一下你想要标记'A'=&gt; 0,'B'=&gt; 1等...然后你用

n1.charAt(i) - 'A'

等......但是当它发生时,我们想要'0'=&gt; 0,'1'=&gt; 1等,所以我们减去'0'。你需要区分“值int”和“角色,char”(后者仍然有数字值,但它不是你可能期望的那样) )。

答案 3 :(得分:0)

当一个字符存储在一个整数中时,它会被转换为它存储的相应ASCII值。

现在的ASCII值为:

'0' (zero as character) is -> 48   
'1' (one as character ) is -> 49
 ......................
 and so on...
  

现在,我们怎样才能从角色中获取整数?

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