正方形


function solution(w, h) {
    [w, h] = w <= h ? [w, h] : [h, w];
    let movedDistance, i = 0, cutedSquare = h;

    while(i < w){
        i++;
        movedDistance = h*i/w;
        if(!Number.isInteger(movedDistance)) cutedSquare++;
    }
    return (w*h) - cutedSquare;
}

に近づく

  • 対角線はこの横方向の弱水点でメッシュの頂点に到達し、
  • .
  • 頂点に達すると、移動中の対角線はメッシュのようにクリップが少なくなります.
  • 格子を移動する毎に対角線が頂点+1に到達しない場合は
  • を行う.

    解説

    [w, h] = w <= h ? [w, h] : [h, w];
    構造分解配分,小変w,大変h
    let movedDistance, i = 0, cutedSquare = h;
    短辺の長さiは、対角線が1移動するたびに移動するmovedDistance=0であり、
    移動するたびに、対角線が頂点に達し、最も少ないメッシュ(正方形)がカットされると、数値から逆数cutedSquare!
    while(i < w){
            i++;
            movedDistance = h*i/w;
            if(!Number.isInteger(movedDistance)) cutedSquare++;
        }
    前述の方法によれば、iが小辺の長さ1で移動するとき
    moveddistanceが整数でない場合、クリップされた矩形の個数++になります.

    難点


    h * (i/w)
    (h/w) * i
    2つの演算はまったく同じように見えますが、異なる結果値が出力される場合があります.

    結果は10進数を使う私たちと違って、2進数を使うコンピュータは小数点を計算する時
    無限小数などの原因で消失します.
    すなわち,上記の演算には他の結果値も存在する可能性がある.
    実際、これも解答の過程で困難に直面した部分です.
    最初は、浮動小数点に関連しています.
    テスト盤は横8歳12歳だったからだ.
    1つの数字0に加えて、3分の2の数字を加えます.
    4の時に3.99999999999996の姿が現れるはずです.

    その時から、私の表現力は背景知識に追いつかないと思います.
    整数部と小数部の精度を改めて知り,解答を行った.

    改善


    コードの速度が思ったより速くないからです.
    ゲートに条件文を追加するにはwhile
    頂点に達したら、
    水平%iと垂直%iの残りのすべての値が0の場合(領域の頂点に達するまで繰り返します)
    だから何度も何度も何度もやって、whileがドアを閉める雄大な計画!
    思ったより失敗例が多かったのですが、どうやって解決するのか!
    まず既存のコードで実行する速度!

    補足後の実行速度!

    終了条件文があるかどうかで、試験例12は364 msから0.10 msに突破した.
    ユークリッド号よりは速度が遅いですが.
    私は解答の過程で考えられなかった方法で解決したくない.
    ちょっと頑固な人ですか?

    補足コード

    function solution(w, h) {
        [w, h] = w <= h ? [w, h] : [h, w];
        let movedDistance, i = 0, cutedSquare = h;
    
        while(i < w){
            i++;
            movedDistance = h*i/w;
            if(!Number.isInteger(movedDistance)) cutedSquare++;
            else{
                if (i === 1) break;
                else if (w%i === 0 && h%i === 0 && w !== h) {
                    cutedSquare += w/i - 1;
                    break;
                }
            }
        }
        return (w*h) - cutedSquare;
    }