코드 사본은 다음과 같습니다.
import java.io.bufferedReader;
import java.io.ioexception;
import java.io.inputStreamReader;
import java.util.regex.matcher;
java.util.regex.pattern import;
/**
* 많은 숫자 곱셈의 간단한 구현은 아직 완벽하지 않습니다.
* 고치다:
* 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));
문자열 [] strarray = buffer.readline (). split ( "//*");
System.out.println (bignumbermultiply (Strarray [0], Strarray [1]);
}
/**
* 크기와 정밀도의 두 숫자의 제품을 계산합니다.
* @param 첫 번째 매개 변수입니다
* @param 두 번째 두 번째 매개 변수
* @return 두 숫자를 곱합니다
*/
개인 정적 문자열 bignumbermultiply (String First, String Second) {
// 긍정적이고 부정적인 부호의 표시
부울 플래그 = 거짓;
if (first.charat (0) == '-') {
플래그 =! 플래그;
첫 번째 = first.substring (1);
}
if (second.charat (0) == '-') {
플래그 =! 플래그;
두 번째 = 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]; // 결과를 저장합니다
// 계산
for (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 ();
for (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이 아닌 경우
부서지다;
}
}
// 끝을 삭제합니다
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 (플래그) {
return "-" + buffer.toString ();
} 또 다른 {
return buffer.toString ();
}
}
/**
* 문자열을 배열로 바꾸십시오
* @param 번호
* @반품
*/
private static int [] string2intarray (문자열 번호) {
// 입력이 부동 소수점 번호의 요구 사항을 충족하는지 확인
Pattern Pattern = Pattern.compile ( "^(-? // d+| // d*) // .?// d*$");
매치기 매치 자 = Pattern.Matcher (번호);
if (! mayser.find ()) {
새로운 불법 행정 exception ( "입력 번호가 잘못되었습니다!");
}
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.ilegalargumentexception : 입력 번호가 올바르지 않습니다!
at bignumber.string2intarray (bignumber.java:132)
bignumber.bignumbermultiply (bignumber.java:54)
bignumber.main (bignumber.java:22)
2. 음수로 작동, 전후에 0.
코드 사본은 다음과 같습니다.
두 개의 큰 정수를 입력하십시오.
-23424.2300*02345.234000000
-54935300.61982
파이썬에서 계산 결과는 다음과 같습니다
코드 사본은 다음과 같습니다.
파이썬 2.6.5
>>> -23424.2300*02345.23400000
-54935300.619819999
파이썬의 결과가 왜곡된다는 것을 알 수 있습니다.