Long Multiplication 2

by whelkaholism

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<div id="debug"></div>
<hr/>
<div id="res"></div>
<hr/>
<div id="processDebug"></div>

JavaScript

var parts = ['u', 't', 'h', 'th', 'tth', 'hth'];

var units = function(v)
{
	v =  ((v || '').valueOf() + '') || '0';
  
  return parseInt(v[v.length - 1]);
}

var tens = function(v)
{
	v =  ((v || '').valueOf() + '') || '0';
  
  return parseInt(v.length >= 2 ? v[v.length - 2] : 0);
}

var n1 = 356;
var n2 = 72;

var an1 = (n1 + '').split('').reverse();
var an2 = (n2 + '').split('').reverse();
var calcs = [];

var intermediates = [];

for(var in2 = 0; in2 < an2.length; in2++)
{
	intermediates[in2] = '';
  
	for(var in1 = 0; in1 < an1.length; in1++)
  {
  	var res = parseInt(an1[in1] * an2[in2]);
    
  	calcs.push({
    	in1: in1,
      in2: in2,
      res: res,
      u: units(res),
      t: tens(res),
      dest: in1
    });
  }
}
  
var process =[];

for(var i = 0; i < calcs.length; i++) 
{
	var calc = 	calcs[i];
  
  var prevcalc = (i > 0 ? calcs[i - 1] : null);
  var prevcarry = (prevcalc ? parseInt(prevcalc.t) : null) || 0;
  var final = parseInt(calc.res) + parseInt(prevcarry);
  var colresult = i == calcs.length - 1 ? final : units(final);
  
  if(prevcalc && (prevcalc.in2 != calc.in2))
  {
  	process.push({
    	action: 'shift'
    });
  }
  
	process.push({
  	action: 'product',
    column: calc.dest + calc.in2,
    product: parseInt(calc.res),
    final: final,
    columnResult: colresult,
    prevCarry: prevcarry,
    carry: parseInt(calc.t)
  });
  
  intermediates[calc.in2] = colresult + intermediates[calc.in2];
}

$('#debug').append(JSON.stringify(intermediates) + '<br/>');

for(var i = 0; i < process.length; i++)
{
	var o = process[i];
  
	$('#res').append(
  	o.action + ' ' + o.product + 
    (o.prevCarry ? ' + ' + o.prevCarry + ' carried over from previous = ' + o.final : '') +
    ' = <b>' + o.columnResult + ' => ' + parts[o.column] + '</b>' + (o.carry ? ' carry ' + o.carry : '') + '<br/>'
    );
  }

$('#res').append('<br/>');

for(var in2 = 0; in2 < an2.length; in2++)
	$('#res').append((intermediates[in2] * Math.pow(10, in2)) + '<br/>');