JavaScript 대수 곱 하기 실현 방법 인 스 턴 스
JavaScript 의 최대 안전 정 수 는 2^{53}C 1,즉 9007199254740991 입 니 다.우리 가 이 범 위 를 초과 한 수 치 를 계산 할 때 정확 한 값 을 얻 지 못 하고 근사치 입 니 다.예 를 들 어 우리 가 9007199254740991+10 을 계산 한 결 과 는 9007199254741000 입 니 다.이 글 은 자바 스 크 립 트 에서 문자열 을 어떻게 이용 하여 대수 적 곱 하기 를 실현 하 는 지 설명 한다.
더 하 다
문자열 로 곱 하기 기본 적 인 사 고 는 우리 가 종이 위 에서 수직 연산 을 하 는 것 과 같다.덧셈 에 대해 우 리 는 두 개의 숫자 num 1 과 num 2 를 상하 로 정렬 한 다음 에 한 자리 부터 두 개의 숫자 가 대응 하 는 비트 의 합 을 계산 하고 가장 높 은 위치 로 순환 하여 모든 연산 결 과 를 하나의 배열 result 에 저장 한 다음 에 Array.prototype.join()방법 으로 하나의 배열 로 복원 해 야 한다.
여기 서 순환 이 정상적으로 진행 되 기 위해 서 는 두 문자열 의 자릿수 가 같 아야 합 니 다.따라서 우 리 는 String.prototpye.padstart()방법 으로 자릿수 가 비교적 작은 문자열 의 앞 을'0'으로 보완 해 야 합 니 다.
위치 에 따라 문 제 는 진 위 를 어떻게 보존 하 느 냐 하 는 것 이다.나의 생각 은 이렇다.우리 가 num 1[i]와 num 2[i]를 더 할 때 가장 많은 두 자릿수 를 얻 을 수 있 습 니 다.이것 은 result 의 두 자리,즉 현재 result[0]위치 와 곧 unshift 가 result 중의 한 사람 에 게 영향 을 줄 것 입 니 다.현재 result[0]위치의 수 는 계산[i-1]이 얻 은 수의 높 은 위치(즉 진 위)입 니 다.우 리 는 우리 가 계산 한 값 을 진 위 를 더 하고 얻 은 수 는 두 자리 로 나 누 어 result 에 넣 습 니 다.
그래서 요약 하면 우리 가 num 1[i]+num 2[i]를 계산 하여 두 자릿수 를 얻 는 것 이다.이 두 자릿수 는 먼저 num1[i-1]+num 2[i-1]의 결과 의 진 위(즉 result[0]를 더 한 다음 에 high 와 low 두 자리 로 나 누 어 result[0]의 값 을 low 비트 로 교체 한 다음 에 high 비트 unshift 를 result 맨 앞 에 가 져 가 야 한다.아래 그림 을 참고 하여 이해 할 수 있다.
그래서 우 리 는 매번 계산 할 때마다 한 사람과 다음 의 진 위 를 확인한다.마지막 코드 는 다음 과 같 습 니 다.
let add = function (num1, num2) {
if (isNaN(num1) || isNaN(num2)) return '';
if (num1 === '0' || num2 === '0') return (num1 === '0' ? num2 : num1);
let len = Math.max(num1.length, num2.length);
num1 = num1.padStart(len, '0');
num2 = num2.padStart(len, '0');
let result = [];
for (let i = len - 1; i >= 0; i--) {
let sum = Number(num1[i]) + Number(num2[i]) + (result[0] || 0);
let low = sum % 10;
let high = Math.floor(sum / 10);
result[0] = low;
result.unshift(high);
}
return result.join('');
}
console.log(add('10', '9007199254740991')) //09007199254741001
코드 에서 우 리 는 두 개의 판단 을 추가 하여 두 개의 매개 변수 가 합 법 적 인 숫자 형식 인지 판단 하고 한 개의 숫자 가'0'이면 다른 수 를 직접 되 돌려 줍 니 다.곱 하 다
상승의 논 리 는 상승의 논리 보다 좀 복잡 하지만 전체적인 사고방식 은 세로 식 에 따라 알고리즘 을 실현 한다.나 는 그림 을 한 장 그 렸 는데 우 리 는 그림 을 빌려 설명 한다.
상승 은 하나의 2 층 순환 이다.우 리 는 하나의 수의 위 치 를 순환 하고 모든 사람 은 다른 수의 순환 하 는 모든 사람과 곱 해 야 한다.우리 가 매번 곱 한 결 과 는 기껏해야 두 자릿수 이다.그러나 더하기 와 달리 하 이 는 매번 unshift 로 들 어가 면 되 고,곱 한 높 은 자리 도 result 의 위치 와 연산 해 야 한다.
우 리 는 상승 하 는 규칙 을 살 펴 보 자.우리 가 num 1[i]*num 2[j]를 사용 할 때 두 자릿수 를 얻 을 수도 있 고 한 자릿수 를 얻 을 수도 있다.우 리 는 모두 두 자릿수 로 계산 하고 높 은 자리 에 없 는 것 은 0 으로 보충 하면 마지막 으로 우리 가 얻 은 결 과 는 i+j 자리 의 수(처음에 보충 하 는 0 이 있 을 수 있다)가 될 것 이다.그리고 우리 가 매번 num1[i]*num 2[j]를 계산 할 때마다 영향 을 주 는 것 은 result 중의 i+j 와 i+j+1 이다.
덧셈 의 논리 와 마찬가지 로 우 리 는 num1[i]*num 2[j]의 결과 와 result[i+j+1]을 더 하여 얻 은 결 과 를 low 와 high 로 나 누 어 reslut 의[i+j+1]과[i+j]에 각각 저장 합 니 다.그러나 여기 서 주의해 야 할 것 은 덧셈 과 달리 덧셈 의 높 은 위 치 를 직접 저장 하면 됩 니 다.여기 있 는 high 에 대응 하 는 result[i+j]는 이미 가치 가 있 을 수 있 습 니 다.우 리 는 이미 존재 하 는 값 을 더 해 야 합 니 다.
high 와 result[i+j]의 더하기 가 존재 할 수 있 습 니 다.어떻게 해 야 합 니까?그림 오른쪽 에 있 는 현재 result 값 을 보면 한 자릿수 가 아 닌 비트 가 저 장 된 것 을 볼 수 있 습 니 다.우 리 는 high+result[i+j]의 값 을 직접 연결 하여 result[i+j]에 저장 합 니 다.왜 이렇게 할 수 있 습 니까?다음 에 num 1[i]*num 2[j-1]를 계산 할 때(우 리 는 뒤에서 앞으로 옮 겨 다 니 는 것 을 주의 하 세 요)result[i+j]와 low 를 더 하면 자 연 스 럽 게 진 위 를 처리 할 수 있 기 때 문 입 니 다.이것 도 이 알고리즘 이 비교적 중요 한 부분 입 니 다.
마지막 코드:
let multiply = function (num1, num2) {
if (isNaN(num1) || isNaN(num2)) return '';
if (num1 === '0' || num2 === '0') return '0';
let l1 = num1.length,
l2 = num2.length;
let result = [];
for (let i = l1 -1; i >= 0; i--) {
for (let j = l2 - 1; j >= 0; j--) {
let index1 = i + j;
let index2 = i + j + 1;
let product = num1[i] * num2[j] + (result[index2] || 0);
result[index2] = product % 10;
result[index1] = Math.floor(product / 10) + (result[index1] || 0);
}
}
return result.join('').replace(/^0+/, '');
}
console.log(multiply('123', '234')) //28782
코드 에 두 가지 판단 이 추가 되 었 습 니 다.합 법 적 인 숫자 인지,한 값 이 0 이면 바로 0 으로 돌아 갑 니 다.마지막 으로 얻 은 결과 의 시작 이 0 인지 아 닌 지 를 판단 하고 있 으 면 지 워 야 합 니 다.여기 서 사용 하 는 정규 표현 식 입 니 다.총결산
자 바스 크 립 트 의 대수 적 곱 하기 실현 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.자 바스 크 립 트 의 대수 적 곱 하기 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[2022.04.19] 자바스크립트 this - 생성자 함수와 이벤트리스너에서의 this18일에 this에 대해 공부하면서 적었던 일반적인 함수나 객체에서의 this가 아닌 오늘은 이벤트리스너와 생성자 함수 안에서의 this를 살펴보기로 했다. new 키워드를 붙여 함수를 생성자로 사용할 때 this는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.