Кода -копия выглядит следующим образом:
Импорт java.io.bufferedReader;
импортировать java.io.ioexception;
Импорт java.io.inputStreamReader;
импортировать java.util.regex.matcher;
Импорт java.util.regex.pattern;
/**
* Простая реализация больших чисел умножение еще не очень идеальна
* Исправить:
* 1. Некоторые ошибки удаления 0 до и после модификации
* 2. Поддержка работы отрицательного числа
* 3. Чтобы определить, соответствует ли входная строка, определяет десятичное значение, используйте регулярные выражения, чтобы судить
* @author Icejoywoo
* @since 2012.2.16
* @version 0.1.1
*/
открытый класс Bignumber {
public static void main (string [] args) бросает ioException {
System.out.println («Введите два больших целых числа:»);
BufferedReader Buffer = new BufferedReader (New InputStreamReader (System.in));
String [] strarray = buffer.readline (). Split ("//*");
System.out.println (BignumberMultiply (Strarray [0], Strarray [1]));
}
/**
* Рассчитайте продукт двух чисел любого размера и точности
* @param первый первый параметр
* @param второй второй параметр
* @return Multiply из двух чисел
*/
Приватная статическая строка BignumberMultiply (String First, String Second) {
// знак положительного и отрицательного знака
логический флаг = false;
if (first.charat (0) == '-') {
flag =! flag;
First = First.Substring (1);
}
if (second.charat (0) == '-') {
flag =! flag;
Second = second.substring (1);
}
// положение десятичной точки
int apoints = first.length () - first.indexof ('.') - 1;
int bpoints = second.length () - second.indexof ('.') - 1;
int pointpos = apoints + bpoints;
// удалить десятичную точку
StringBuffer abuffer = new StringBuffer (First.ReplAceall ("//.", ""));
StringBuffer bbuffer = new StringBuffer (Second.ReplAceall ("//.", ""));
int [] a = string2intarray (abuffer.toString ());
int [] b = string2intarray (bbuffer.tostring ());
int [] result = new Int [A.Length + B.Length - 1];
// Рассчитайте
для (int i = 0; i <a.length; i ++) {
for (int j = 0; j <b.length; j ++) {
результат [i + j] + = a [i] * b [j];
}
}
// Если определенный в результате больше 9, его необходимо перенести.
for (int i = result.length -1; i> = 0; --I) {
if (result [i]> 9) {
результат [i - 1] += результат [i] / 10;
результат [i] = результат [i] % 10;
}
}
StringBuffer Buffer = new StringBuffer ();
для (int i = 0; i <result.length; ++ i) {
// Добавить десятичные очки
if (result.length - i == pointpos) {
buffer.append (".");
}
buffer.append (string.valueof (result [i]));
}
if (buffer.indexof (".")! = -1)
{
// удалить первое 0
int i = 0;
while (i <buffer.length ()) {
if (buffer.length ()> 2 && buffer.charat (i+1) == '.') {// Есть только одно число 0 до десятичной точки.
перерыв;
} else if (buffer.charat (i) == '0') {// удалить первое 0
buffer.deletecharat (i);
i = 0;
продолжать;
} else {// Когда первая позиция не 0
перерыв;
}
}
// удалить конец 0
i = buffer.length () - 1;
while (i> = 0) {
if (buffer.length ()> 2 && buffer.charat (i-1) == '.') {// Десятичная точка-это непосредственно число
перерыв;
} else if (buffer.charat (i) == '0') {// удалить 0 в конце
buffer.deletecharat (i);
i = buffer.length () - 1;
продолжать;
} else {// Когда последний бит не 0
перерыв;
}
}
}
// в соответствии с битом знака положительные и отрицательные флаги возвращаемого значения
if (flag) {
вернуть "-" + buffer.toString ();
} еще {
return buffer.tostring ();
}
}
/**
* Замените строку на массив
* @param номер
* @возвращаться
*/
private static int [] string2intarray (строковый номер) {
// Определите, соответствует ли вход требованиям номеров с плавающей запятой
Шаблон шаблона = pattern.compile ("^(-? // d+| // d*) //.?// d*$");
Matcher Matcher = pattern.matcher (номер);
if (! matcher.find ()) {
Бросьте новое allogalargumentException («Входной номер неверный!»);
}
int [] result = new int [number.length ()];
for (int i = 0; i <number.length (); i ++) {
результат [i] = (int) (number.charat (i) - '0');
}
результат возврата;
}
}
Результаты работы следующие:
1. Суждение о неправильном вводе
Кода -копия выглядит следующим образом:
Введите два больших целых числа:
1a*a22
Исключение в потоке "Main" java.lang.illegalargumentException: входной номер неверный!
at bignumber.string2intarray (bignumber.java:132)
на bignumber.bignumbermultiply (bignumber.java:54)
у Bignumber.main (Bignumber.java:22)
2. Работа с отрицательными числами, с 0 до и после
Кода -копия выглядит следующим образом:
Введите два больших целых числа:
-23424.2300*02345.234000000
-54935300.61982
Результаты расчета в Python следующие
Кода -копия выглядит следующим образом:
Python 2.6.5
>>> -23424.2300*02345.23400000
-54935300.619819999
Видно, что результаты питона искажены