2015-06-19 3 views
2

Почему '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(); 
} 
+1

попробовать эти: 'System.out.println ((ИНТ) '0');' и 'System.out.println ((int) '3'); ', тогда вы поймете – hoijui

ответ

2

Почему «0» вычитается из n1.charAt (i) и n2.charAt (j)?

Поскольку номер символа Unicode, представляющий цифру 0 48, а не 0.

Представьте, что вы хотели, чтобы маркировать 'A' => 0, 'B' => 1 и т.д. ... то вы бы использовать

n1.charAt(i) - 'A' 

и т.д ... но как это происходит, мы хотим '0' => 0, '1' => 1 и т.д., поэтому мы вычитаем '0'. Вы должны различать «значение, как int» и «символ, как char» (где последнее по-прежнему имеет числовое значение, но это не то, что вы можете ожидать).

2

Вычитание «0» из символа, содержащего цифру, дает вам числовое значение этого символа.

Например, «9» - «0» дает число 9.

Причиной этого является то, что цифры символы («0» до «9») имеют целые значения от 48 до 57, так что «9» - «0» эквивалентно 57 - 48, что дает вам 9.

3

Он вычисляет (вычитанием) числовое значение символа. Символьная константа 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); 
} 

или

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

Когда символ хранится в целочисленном размере, он преобразуется в соответствующий ASCII значение сохранено.

Теперь значение ASCII из:

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

Теперь, как мы можем получить целое число из характера?

Его легко вычесть 48 из всех числовых символа и который является ASCII из '0'

Смежные вопросы