正剧开始:
星历2016年01月01日 13:58:44, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起观看[100以内的加法和减法(二)]。
然后小伟看到了竖式。
星历2016年01月01日 15:36:17, [机器小伟]说:[阿伟大人],这个竖式好有趣,我也要画。
要画竖式,先要解决右对齐的问题。
阿伟帮小伟解决了:
<span style="font-size:18px;">/** * @usage 把一个数字按照基准点右对齐绘制 * @author mw * @date 2016年01月01日 星期五 13:59:42 * @param * @return * */ function rightAlign(num, x, y, r) { var s = num.toFixed(0); var digitBit = s.length; var digit = new Digit(); var xpos=0, ypos=0; for (var i = digitBit-1; i > -1; i--) { xpos = x - r * (digitBit - i); ypos = y; digit.number(s.charAt(i), xpos, ypos, r); } }</span>
<span style="font-size:18px;">/** * @usage 加法竖式 * @author mw * @date 2016年01月01日 星期五 13:59:42 * @param * @return * */ /* 算术竖式 Vertical arithmetic 加数 addend 被加数 Augend 加号 Plus */ function verticalAdd(augend, addend, x, y, r) { var result = addend + augend; var xBeg = x ? x : 300, yBeg = y ? y :100, large = r ? r : 20; var maxBit = Math.max(addend, augend).toFixed(0).length; var plusPos = x - (maxBit+2) * r; rightAlign(augend, x, y, r); rightAlign(addend, x, y+1.5*r, r); plot.setFillStyle('black') .fillText('+', plusPos, y+1.5*r, r); plot.beginPath() .moveTo(plusPos - 1 * r, y + 2.5*r) .lineTo(x + 1 * r, y + 2.5 * r) .closePath() .stroke(); rightAlign(result, x, y + 3.5 * r, r); }</span>
于是小伟做了下面的题:
<span style="font-size:18px;">function myDraw() { plot.init(); setPreference(); var r = 20; var row = 0, col = 4; var task = [32,6,24,3,5,43,21,3,4,33]; var len = task.length / 2; row = Math.ceil(len/(col-1)); //document.body.appendChild(document.createTextNode(len.toFixed(0) + ', ' + row.toFixed(0))); var rowCount = 1, colCount = 2; for (var i = 0; i < len; i++) { setSector(row, col, rowCount, colCount++); if (colCount > col) { colCount = 2; rowCount++; } verticalAdd(task[2*i], task[2*i+1],0, 0, r); } }</span>
这节的有趣内容还是很多的,比如:
接着小伟看到了减法。
看来还要有减法竖式:
<span style="font-size:18px;">/** * @usage 减法竖式 * @author mw * @date 2016年01月01日 星期五 13:59:42 * @param * @return * */ /* 被减数 Minuend 减数 subtrahend 减号 Minus sign */ function verticalSub(minuend, subtrahend, x, y, r) { var result = minuend - subtrahend; var xBeg = x ? x : 300, yBeg = y ? y :100, large = r ? r : 20; var maxBit = Math.max(minuend, subtrahend).toFixed(0).length; var minusPos = x - (maxBit+2) * r; rightAlign(minuend, x, y, r); rightAlign(subtrahend, x, y+1.5*r, r); plot.setFillStyle('black') .fillText('-', minusPos, y+1.5*r, r); plot.beginPath() .moveTo(minusPos - 1 * r, y + 2.5*r) .lineTo(x + 1 * r, y + 2.5 * r) .closePath() .stroke(); rightAlign(result, x, y + 3.5 * r, r); } </span>
<span style="font-size:18px;">function myDraw() { plot.init(); setPreference(); var r = 20; var row = 0, col = 3; var task = [45,3,64,42,48,18,25,21]; var len = task.length / 2; row = Math.ceil(len/(col-1)); //document.body.appendChild(document.createTextNode(len.toFixed(0) + ', ' + row.toFixed(0))); var rowCount = 1, colCount = 2; for (var i = 0; i < len; i++) { setSector(row, col, rowCount, colCount++); if (colCount > col) { colCount = 2; rowCount++; } verticalSub(task[2*i], task[2*i+1],0, 0, r); } }</span>
又来有趣的图了:
还有这个:
接着小伟看到了一个更加好玩的题:
解这种问题可是小伟的强项:
<span style="font-size:18px;">def tmp(): a = [46,18,76,31]; b = [7,37,52,65]; c = [98,71,80,91]; d = [18,29,36,9]; for i in range(len(a)): for j in range(len(b)): if a[i]+b[j] == 83: print('{0} + {1} = 83'.format(a[i], b[j])); for i in range(len(c)): for j in range(len(d)): if c[i]-d[j] == 62: print('{0} - {1} = 62'.format(c[i], d[j])); return;</span>
<span style="font-size:18px;">>>> 46 + 37 = 83 18 + 65 = 83 76 + 7 = 83 31 + 52 = 83 98 - 36 = 62 71 - 9 = 62 80 - 18 = 62 91 - 29 = 62</span>竟然有这么多的答案!
话说这节有趣的图还真多,这里又来一张:
连加怎么办,小伟问阿伟。阿伟说,这也好办,就给了小伟下面的代码:
<span style="font-size:18px;">/** * @usage 连续加法竖式 * @author mw * @date 2016年01月01日 星期五 13:59:42 * @param * @return * */ /* 算术竖式 Vertical arithmetic 加数 addend 被加数 Augend 加号 Plus */ function verticalAdd2(arr, x, y, r) { var array = new Array(); array = arr; var len = array.length; if (len < 2) return; var result = array[0] + array[1]; var xBeg = x ? x : 300, yBeg = y ? y :100, large = r ? r : 20; var maxBit = Math.max(array[0], array[1]).toFixed(0).length; var plusPos = x - (maxBit+2) * r; rightAlign(array[0], x, y, r); y += 1.5 * r; rightAlign(array[1], x, y, r); plot.setFillStyle('black') .fillText('+', plusPos, y, r); y += 1.0 * r; plot.beginPath() .moveTo(plusPos - 1 * r, y) .lineTo(x + 1 * r, y) .closePath() .stroke(); y += 1.5 * r; rightAlign(result, x, y, r); if (array.length > 2) { for (var i = 2; i < array.length; i++) { maxBit = Math.max(result, array[i]).toFixed(0).length; plusPos = x - (maxBit+2) * r; result += array[i]; y += 1.5 * r; rightAlign(array[i], x, y, r); plot.fillText('+', plusPos, y, r); y += 1.0 * r; plot.beginPath() .moveTo(plusPos - 1 * r, y) .lineTo(x + 1 * r, y) .closePath() .stroke(); y += 1.5 * r; rightAlign(result, x, y, r); } } }</span>
本节到此结束,欲知后事如何,请看下回分解。