この解答例は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法を使うことで、高速に計算できます。しかし、ここでは基本的なアルゴリズムを紹介することを重視しました。