Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트로 자릿수 거듭제곱 합이 입력 수의 배수가 되게 하는 k 찾기


문제 정의

양의 정수 n(예: abcd... 형태로 표현되며, a, b, c, d...는 각각의 자릿수)와 양의 정수 p를 입력받는 자바스크립트 함수를 작성해야 합니다.

  • n의 각 자릿수를 p부터 시작해 하나씩 증가하는 거듭제곱으로 계산한 값들의 합이, 어떤 양의 정수 k에 대해 k × n과 정확히 같아지도록 만드는 k가 존재하는지 찾습니다.

다시 말해 다음 조건을 만족하는 정수 k가 존재하는지 묻는 것입니다 −

(a ^ p + b ^ (p+1) + c ^ (p+2) + d ^ (p+3) + ...) = n × k

조건을 만족하는 k가 존재하면 그 값을 반환하고, 존재하지 않으면 -1을 반환합니다.

예제 코드

다음은 위 문제를 해결하는 자바스크립트 코드입니다 −

const num = 695;
const p = 2;
const findDesiredNumber = (num, p) => {
   let sum = 0;
   let str = String(num);
   for(const char in str){
      sum += Math.pow(str[char], p);
      p++;
  };
  return Number.isInteger(sum/num) ? sum/num : -1;
};
console.log(findDesiredNumber(num, p));

출력 결과

위 코드의 콘솔 출력 결과는 다음과 같습니다 −

2

코드 동작 방식

코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다 −

  1. 문자열 변환: String()으로 숫자를 문자열로 바꾸면 각 자릿수에 인덱스로 접근할 수 있습니다.
  2. 거듭제곱 누적: for...in 반복문으로 각 자릿수를 순회하면서 Math.pow()로 현재 지수 p만큼 거듭제곱한 값을 합계에 더하고, 매 반복마다 p를 1씩 증가시킵니다.
  3. 배수 판별: 최종 합계를 n으로 나누어 나머지가 없으면 몫 k를 반환하고, 나누어떨어지지 않으면 -1을 반환합니다.

예를 들어 n = 695, p = 2인 경우 −

6² + 9³ + 5⁴ = 36 + 729 + 625 = 1390 = 695 × 2 이므로 결과는 2입니다.

주의할 점

이 문제에서 흔히 저지르는 실수는 거듭제곱 대신 단순 곱셈(str[char] * p)을 사용하는 것입니다. 이렇게 하면 문제가 요구하는 '연속적인 거듭제곱의 합' 조건과 어긋나 잘못된 결과가 나오므로, 반드시 Math.pow() 또는 ** 연산자를 사용해야 합니다.

추가 테스트 예제

console.log(findDesiredNumber(89, 1));    // 1  (8¹ + 9² = 89 = 89 × 1)
console.log(findDesiredNumber(92, 1));    // -1 (9¹ + 2² = 13, 92의 배수 아님)
console.log(findDesiredNumber(46288, 3)); // 51 (4³ + 6⁴ + 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 × 51)