この解答例はChatGPTによって生成されています,正しいかは自己判断で。

BFE.devでのAI解答例 - JavaScript コーディング問題
75. BigInt の引き算を実装する

以下が解答例です。

function subtract(str1, str2) {
  const len1 = str1.length;
  const len2 = str2.length;
  let borrow = 0; // 借位
  let diff = ''; // 差を表す文字列

  // 2つの数字が同じ桁数に揃うように0でパディング
  if (len1 > len2) {
    str2 = str2.padStart(len1, '0');
  } else if (len1 < len2) {
    str1 = str1.padStart(len2, '0');
  }

  // 文字列の一番右(最下位位)から計算開始、借位に注意
  for (let i = str1.length - 1; i >= 0; i--) {
    let digit1 = parseInt(str1[i]);
    let digit2 = parseInt(str2[i]);
    let digitDiff = digit1 - digit2 - borrow;

    if (digitDiff < 0) {
      digitDiff += 10;
      borrow = 1;
    } else {
      borrow = 0;
    }

    diff = digitDiff + diff;
  }

  // 先頭の0を除く
  diff = diff.replace(/^0+/, '');

  return diff;
}

まず、2つの数字が同じ桁数に揃うように0でパディングします。これを行うと、i番目の桁の差は parseInt(str1[i]) - parseInt(str2[i]) として簡単に求めることができます。

ただし、桁の値が異なる場合、上位桁から借位することが必要です。たとえば、 str1 = '52'str2 = '87' の場合、下位桁の 2 を借位して 10 を加える必要があります。このステップには、 borrow 変数が使われます。

最後に、先頭の0を除いて計算結果を返します。

このコードは、100桁程度までの大きな数でも動作しますが、より高速なアルゴリズムが存在します。たとえば、半分全列挙法やKaratsuba法を使うことで、高速に計算できます。しかし、ここでは基本的なアルゴリズムを紹介することを重視しました。