剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入练气期第三层功法的修炼,
这次要修炼的目标是[100以内的加法和减法(二)]。
接着就可以画加法竖式了。
来尝试一下吧。
小伟接着做:
结果让小伟大吃一惊:
看看效果吧:
[机器小伟]在[工程师阿伟]的陪同下进入练气期第三层功法的修炼,
这次要修炼的目标是[100以内的加法和减法(二)]。
正剧开始:
星历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>
看看效果吧:
本节到此结束,欲知后事如何,请看下回分解。