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

BFE.devでのAI解答例 - JavaScript コーディング問題
76. BigIntの足し算を実装する II

function add(num1, num2) {
  let sign1 = num1[0] === '-' ? -1 : 1; // num1の符号
  let sign2 = num2[0] === '-' ? -1 : 1; // num2の符号
  let numArr1 = num1.split(''); // num1を配列に変換
  let numArr2 = num2.split(''); // num2を配列に変換
  
  // num1とnum2の符号が同じ場合
  if (sign1 === sign2) {
    let sum = ''; // 和を格納する変数
    let carry = 0; // 桁上がりを格納する変数
 
    // num1とnum2のどちらかが負の場合、符号を取り除いた配列から_i番目の値を取得する
    // 両方が正の場合、符号を取り除いた配列から後ろの_i番目の値を取得する
    for (let i = 1; i <= Math.max(numArr1.length, numArr2.length); i++) {
      let val1 = numArr1[numArr1.length - i] || 0;
      let val2 = numArr2[numArr2.length - i] || 0;
      let digitSum = carry + sign1 * val1 + sign2 * val2; // i桁目の和を計算する
      carry = Math.floor(digitSum / 10); // 桁上がりを計算する
      sum = Math.abs(digitSum % 10) + sum; // 各桁の数値を格納する
    }
    
    // 結果のコードを作成する
    if (carry !== 0) {
      sum = carry + sum;
    }
    if (sign1 === -1) {
      sum = '-' + sum;
    }
    return sum;
  }
  
  // num1とnum2の符号が異なる場合、足し算を引き算に変換する
  if (sign1 !== sign2) {
    // num1が負の場合、符号を取り除いた配列から_i番目の値を取得する
    if (sign1 === -1) {
      numArr1.shift();
      return subtract(numArr2.join(''), numArr1.join(''));
    }
    // num2が負の場合、符号を取り除いた配列から_i番目の値を取得する
    if (sign2 === -1) {
      numArr2.shift();
      return subtract(numArr1.join(''), numArr2.join(''));
    }
  }
}

// 引き算の関数
function subtract(num1, num2) {
  let numArr1 = num1.split('');
  let numArr2 = num2.split('');
  let borrow = 0; // 借りを格納する変数
  let diff = ''; // 差を格納する変数
  
  for (let i = 1; i <= Math.max(numArr1.length, numArr2.length); i++) {
    let val1 = numArr1[numArr1.length - i] || 0;
    let val2 = numArr2[numArr2.length - i] || 0;
    let digitDiff = val1 - borrow - val2; // i桁目の差を計算する
    if (borrow > 0) {
      borrow = 0;
    }
    if (digitDiff < 0) {
      digitDiff += 10; // 借りている場合は10を加える
      borrow = 1; // 桁借りを設定する
    }
    diff = digitDiff + diff;
  }
  
  // 先頭の余分な0を削除する
  while (diff[0] === '0' && diff.length > 1) {
    diff = diff.slice(1);
  }
  
  // 結果の符号を決定する
  if (borrow === 1 && num1 !== num2) {
    diff = '-' + diff;
  }
  return diff;
}

この問題では、まず add 関数で符号の処理を行い、両方の引数を正の整数として扱います。その後、符号の差に基づいて足し算を引き算に変換します。

足し算は、各桁で和を計算し、桁上がりを次の桁に渡すことによって実行されます。引き算は、各桁で差を計算し、借りを次の桁に渡すことによって実行されます。

最後に、結果の符号を計算して、結果を返します。