この解答例はChatGPTによって生成されています,正しいかは自己判断で。
BFE.devでのAI解答例 - JavaScript コーディング問題
126. BigDecimal 足し算
解法例:
function add(a, b) {
// 文字列に変換する
a = a.toString();
b = b.toString();
// 負号の処理と絶対値を取る
let signA = a[0] === '-' ? -1 : 1;
let signB = b[0] === '-' ? -1 : 1;
a = a.replace('-', '');
b = b.replace('-', '');
// .を含む部分を切り分ける
let intA = a.split('.')[0];
let fracA = a.split('.')[1] || '';
let intB = b.split('.')[0];
let fracB = b.split('.')[1] || '';
// 小数点以下を0埋めする
while (fracA.length < fracB.length) {
fracA += '0';
}
while (fracB.length < fracA.length) {
fracB += '0';
}
// 加算
let carry = 0;
let result = '';
for (let i = intA.length - 1; i >= 0; i--) {
let sum = Number(intA[i]) + Number(intB[i]) + carry;
carry = sum >= 10 ? 1 : 0;
result = (sum % 10) + result;
}
for (let i = fracA.length - 1; i >= 0; i--) {
let sum = Number(fracA[i]) + Number(fracB[i]) + carry;
carry = sum >= 10 ? 1 : 0;
result = (sum % 10) + result;
}
// 最終結果の後続ゼロを取り除く
result = result.replace(/^0+/, '');
if (result === '.') {
result = '0';
}
// 結果に負号をつける
if (signA === -1 && signB === -1) {
result = '-' + result;
} else if (signA === -1) {
if (intA === intB && fracA === fracB) {
result = '0';
} else if (Number(intA) > Number(intB) || (Number(intA) === Number(intB) && Number(fracA) > Number(fracB))) {
result = '-' + result;
}
} else if (signB === -1) {
if (intA === intB && fracA === fracB) {
result = '0';
} else if (Number(intB) > Number(intA) || (Number(intA) === Number(intB) && Number(fracB) > Number(fracA))) {
result = '-' + result;
}
}
return result;
}
この解法では、まずaとbを文字列に変換し、それぞれの符号と絶対値を取ります。小数点以下の桁数を揃えるために、0を付け加える必要がある場合があります。それから、加算を行います。最後に、後続ゼロを取り除き、最終結果に負号を付けます。