[白俊]JavaScript 4673セルフサービス番号


Question


[白俊]JavaScript 4673セルフサービス番号

input


なし.

output


10000以下の自己符号を行ごとに1つ追加する順序で出力します.

example


1
3
5
7
9
20
31
42
53
64
|
| <-- a lot more numbers
|
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993

Solution 1


除算と余剰演算により各ビット数を求める.
falseが10000の配列を作成し、for文の周りに数字と各ビット数の和(d(n))が等しい2番目の配列要素(arr[d(i)−1])をtrueに設定します.このプロセスで配列が作成され、その配列が自己符号化されているかどうかで構成されている場合、falseの値を持つ要素(自己符号化)のみが出力されます.
function d(n){
    let sum=n;
    let temp=sum;
    while(temp>0){
        sum+=temp%10;
        temp=parseInt(temp/10);
    }
    return sum;
}
const N=10000;
const arr=new Array(N).fill(false);
for(let i=1;i<=N;i++){
    arr[d(i)-1]=true;
}
for(let i=0;i<N;i++){
    !arr[i]&&console.log(i+1);
}

Solution 2


文字列split(")メソッドで各ビット数を作成し、reduceで合計します.
空の配列を作成し、結果値を入れてjoin('\n')で一度に出力します.
let temp = [];
let result = [];
for(let i = 1; i <= 10000; i++) {
  temp.push(i + i.toString().split('').reduce((prev, curr)=> prev + parseInt(curr), 0));
}
for(let i = 1; i <= 10000; i++) {
  if(temp.indexOf(i) === -1){
      result.push(i);
  }
}
console.log(result.join('\n'));

What I learned


1.桁数が指定されておらず、各桁数を加算したい場合


合計(sum)と一時値(temp)を含む変数を作成し、while lotempの作業位置を求め、sumに追加し、parseInet(temp/10)の作業位置にtempを減算します.(ex.4321=>432)tempが動作する位置になるまでこのように繰り返す.(ex. temp: 4321=>432=>43=>4)

2.n個のパディング配列を作成する方法

  • new Array(N).fill(어떤 값)
  • new Array(N):未定義の佳N個人案の生成
  • arr.fill(value[, start[, end]]):アレイの特定領域を特定値で埋める
  • Array.from({length:N},()=>어떤 값)
  • 3. arr.indexOf(searchElement[, fromIndex])


    indexOf()メソッドは、配列内に指定された要素を見つけることができる最初のインデックスを返し、存在しない場合は-1を返します.

    Reference


    https://dpsc615.tistory.com/40
    https://www.acmicpc.net/source/2856026