JavaScript에서 Kaprekar의 상수

그래서 어느 날 틱톡을 스크롤하다가 동영상 중 하나에 나오는 숫자6174를 보았습니다. 이것은 인도 수학자D. R. Kaprekar의 이름을 딴 Kaprekar 상수라는 특수한 숫자인 것으로 밝혀졌습니다.

2개 이상의 다른 숫자가 포함된 4자리 숫자로 시작합니다. 숫자가 4자리 미만이면 0으로 채울 수 있습니다. 예를 들어 420042가 됩니다.
  • 최대값과 최소값을 얻기 위해 최대값에서 최소값으로 숫자를 정렬하고 최소값에서 최대값으로 다시 정렬합니다.
  • 최대값에서 최소값을 뺍니다.
  • 이 단계를 반복합니다.

  • 결과는 적은 수의 반복 후에 항상 6174로 수렴됩니다.

    예를 들어,

    628
    8620 - 268 = 8352
    8532 - 2358 = 6174



    하지만 이 작업을 손으로 하는 것은 지루합니다. Kaprekar의 알고리즘을 더 자세히 알아보기 위해 몇 가지 코드를 작성해 봅시다!

    개념에서 코드로



    핵심 알고리즘은 다음과 같이 JavaScript로 구현될 수 있습니다.

    먼저 주어진 숫자를 문자열로 변환합니다padded with leading zeros.

    > var num = 423;
    > num.toString().padStart(4, '0');
    '0423'
    

    그런 다음 숫자를 배열로 분할하여 최소 및 최대 숫자로 배열할 수 있습니다. 배열 작업은 제자리에서 수행되므로 각 값에 대해 새 배열이 생성됩니다.

    > var min = num.split('').sort()
    [ '0', '2', '3', '4' ]
    > var max = num.split('').sort().reverse()
    [ '4', '3', '2', '0' ]
    

    마지막으로 join를 사용하여 각 배열을 다시 문자열로 변환하고 parseInt를 사용하여 값을 뺄 수 있도록 다시 숫자로 변환합니다.

    > parseInt(min.join(''))
    234
    > parseInt(max.join(''))
    4320
    

    자바스크립트 구현



    최종 코드는 validate 함수를 통합하여 여러 자리 숫자가 없는 숫자를 거부하고 임의의 4자리 숫자를 사용하여 알고리즘을 자동으로 실행합니다.






    유효성 검사 = 함수(숫자) {
    for (var i = 0; i < 10000; i += 1111) {
    if (숫자 == i) {
    거짓을 반환합니다.
    }
    }
    true를 반환합니다.
    }

    kaprekar = 기능 (숫자) {
    if (!validate(num)) {
    console.log("잘못된 숫자 "+ num);
    반품;
    }
    console.log(숫자);
    동안 (숫자! = 6174) {
    var str = num.toString().padStart(4, '0');
    var max = parseInt(str.split('').sort().reverse().join(''));
    var min = parseInt(str.split('').sort().join(''));
    숫자 = 최대 - 최소;
    console.log(숫자);
    }
    }

    var n = Math.random() * 10000 | 0;//출처 https://stackoverflow.com/a/61696576
    카프레카르(n);




    하지만 더 있습니다!



    다음은 모든 4자리 숫자에 대해 6174에 도달하는 데 걸리는 많은 반복의 히스토그램을 생성하는 프로그램의 변형입니다.






    카운트 = {};

    유효성 검사 = 함수(숫자) {
    for (var i = 0; i < 10000; i += 1111) {
    if (숫자 == i) {
    거짓을 반환합니다.
    }
    }
    true를 반환합니다.
    }

    kaprekar = 함수(숫자) {
    변수 개수 = 0;
    if (!validate(num)) {
    반품;
    }
    동안(숫자!= 6174) {
    str = num.toString().padStart(4, '0');
    max = parseInt(str.split('').sort().reverse().join(''));
    min = parseInt(str.split('').sort().join(''));
    숫자 = 최대 - 최소;
    카운트++;
    }
    카운트[카운트] = 카운트[카운트] || 0;
    카운트[카운트]++;
    }

    for (var i = 1; i < 10000; i++) {
    카프레카르(i);
    }
    console.log(개수);



    이 코드를 실행하면 최대 7번 반복한 후에 6174에 도달하는 것을 볼 수 있습니다.

    { '0': 1,
      '1': 383,
      '2': 576,
      '3': 2400,
      '4': 1272,
      '5': 1518,
      '6': 1656,
      '7': 2184 }
    


    결론



    그리고 그게 다야! 이 재미있는 소소한 정보를 즐기셨기를 바랍니다.

    여러분의 생각을 댓글로 자유롭게 남겨주세요☀️ 😄 👍

    좋은 웹페이지 즐겨찾기