JavaScriptでカプレカ数を探す旅

16進数にもカプレカ数はある(2進数にもある)

この記事を三行にまとめると

入力した数字がカプレカ数か判定する
カプレカ数になるまで操作を繰り返す
16進数のカプレカ数を判定
この記事は以下の動画の中に出てきたサンプルコードを載せたものです。コピペなどが必要なときに使ってください。





HTMLとCSS

<div>
  <input type="number" id="number">
  <button type="button" id="start">検証開始</button>
</div>
<div id="formula"></div>
<div id="result"></div>

<style>
  * { font-size: 24px; font-family: 'メイリオ' }
  body { text-align: center }
  input, button { padding: 5px }
</style>



入力された数字がカプレカ数か判定する

number = document.getElementById('number');
start = document.getElementById('start');
formula = document.getElementById('formula');
result = document.getElementById('result');

start.onclick = function() {
  num = number.value;

  lists = num.split('');
  min = lists.sort().join('');
  max = lists.reverse().join('');
  answer = max - min;

  formula.innerText = max + ' - ' + min + ' = ' + answer;
  result.innerText = (num == answer) ? 'カプレカ数です!' : 'カプレカ数じゃないです';
}



入力した数以下のカプレカ数を抽出

start.onclick = function() {
  num = number.value;
  kaprekar = [];

  for(i = 0; i <= num; i++) {
    lists = String(i).split('');
    min = lists.sort().join('');
    max = lists.reverse().join('');

    if(i == max - min) {
      kaprekar.push(i);
    }
  }

  result.innerText = 'カプレカ数は' + kaprekar.join(', ');
}



カプレカ数になるか計算結果がループするまで操作を繰り返す

start.onclick = function() {
  num = number.value;
  result.innerText = '';
  answers = [];

  while(true) {
    lists = String(num).split('');
    min = lists.sort().join('');
    max = lists.reverse().join('');
    answer = max - min;

    if(num == answer) {
      result.innerText += 'カプレカ数になりました!';
      break;
    } else {
      result.innerText += max + ' - ' + min + ' = ' + answer + '\n';

      if(answers.includes(answer)) {
        result.innerText += 'ループに入りました';
        break;
      }

      answers.push(answer);
      num = answer;
    }
  }
}



16進数のカプレカ数を判定

start.onclick = function() {
  num = number.value;

  lists = num.split('');
  min = '0x' + lists.sort().join('');
  max = '0x' + lists.reverse().join('');
  answer = (max - min).toString(16);

  formula.innerText = max.substring(2) + ' - ' + min.substring(2) + ' = ' + answer;
  result.innerText = (num == answer) ? 'カプレカ数です!' : 'カプレカ数じゃないです';
}
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください