プログラマコード問題2010/12/01(プールを変更する必要がある)-Lv.2正方形


[質問]


長方形の紙があり、幅はWcm、長さはHcmです.紙には水平方向と垂直方向に平行なグリッド線があり、すべてのグリッドは1 cm x 1 cmの大きさです.1 cm(グリッドに沿って)× 1センチの正方形に切るつもりだったが、この紙を2つの対角線の頂点を結ぶ方向に切った人がいた.したがって、現在の矩形紙は、同じ大きさの2つの直角三角形に分かれています.新しい用紙が見つからないため、この用紙の横方向と縦方向は元の用紙と平行1 cmである× 1 cmに切って、使えるだけ使ってください.
横方向長さWと縦方向長さHが与えられた場合、使用可能な正方形の個数を求める解法関数を完了する.
せいげんじょうけん
W,H:1億以下の自然数
I/O例
W
H
result
8
12
80
I/O例説明
I/O例#1
幅8、奥行き12の長方形を対角線方向に切り取ると、合計16個の正方形が使用できません.元の長方形は96個の正方形を作成することができ、96~16=80を返します.

[回答]

function solution(w, h) {
  let heightPerWidth = h / w;
  let accumulate = 0;
  let removeBox = 0;
  let count = 0;
   
  while(true) {
    let init = Math.floor(accumulate);
    let length = Math.ceil(accumulate + heightPerWidth);
       
    removeBox += (length - init);
      
    accumulate += heightPerWidth;
    count += 1;
       
    if(!((accumulate * 10) % 10)) {
      break;
    }
  }
   
  return (w * h) - (removeBox * (w / count));
}
対角線が始点以外の小さな長方形の頂点と交差するまで.
対角線の横線の1つあたりに遭遇する矩形の数の累積と繰返し回数に基づいて.
乗じた矩形の個数を求めて、間違いのケースは多くて、通じません.
function solution(w, h) {
  let gcd = 1;
  let num = 2;
  let width = w;
  let height = h;
   
  while(Math.min(width, height) > num) {
    if(!(width % num) && !(height % num)) {
      gcd *= num;
      width /= num;
      height /= num;
    }
    else {
      num++;
    }
  }
   
  return (w * h) - (w + h - gcd);
}
おかしいと思ったので、最大公倍数を利用させてもらった答えを報告しましたが、だめでした...なんだよ.
正解で撮れなかったので、どこが間違っているのかさっぱり分からず、鬱陶しい.