[从头学数学] 第20节 100以内的加法和减法(二)

剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入练气期第三层功法的修炼,
这次要修炼的目标是[100以内的加法和减法(二)]。

正剧开始:

星历2016年01月01日 13:58:44, 银河系厄尔斯星球中华帝国江南行省。

[工程师阿伟]正在和[机器小伟]一起观看[100以内的加法和减法(二)]。


然后小伟看到了竖式。

[从头学数学] 第20节 100以内的加法和减法(二)_第1张图片

星历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>

来尝试一下吧。

于是小伟做了下面的题:

[从头学数学] 第20节 100以内的加法和减法(二)_第2张图片


<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>



这节的有趣内容还是很多的,比如:

[从头学数学] 第20节 100以内的加法和减法(二)_第3张图片

接着小伟看到了减法。


[从头学数学] 第20节 100以内的加法和减法(二)_第4张图片

看来还要有减法竖式:

<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>

小伟接着做:

[从头学数学] 第20节 100以内的加法和减法(二)_第5张图片

<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>


[从头学数学] 第20节 100以内的加法和减法(二)_第6张图片

又来有趣的图了:

[从头学数学] 第20节 100以内的加法和减法(二)_第7张图片

还有这个:

接着小伟看到了一个更加好玩的题:

[从头学数学] 第20节 100以内的加法和减法(二)_第8张图片

解这种问题可是小伟的强项:


<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>
竟然有这么多的答案!


话说这节有趣的图还真多,这里又来一张:

[从头学数学] 第20节 100以内的加法和减法(二)_第9张图片


连加怎么办,小伟问阿伟。阿伟说,这也好办,就给了小伟下面的代码:

<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>


看看效果吧:

[从头学数学] 第20节 100以内的加法和减法(二)_第10张图片

本节到此结束,欲知后事如何,请看下回分解。

你可能感兴趣的:([从头学数学] 第20节 100以内的加法和减法(二))