[从头学数学] 第110节 整式的加减

剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了筑基初期的修炼,
这次要修炼的目标是[整式的加减]。

正剧开始:

星历2016年02月26日 11:57:30, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[整式的加减]。



[从头学数学] 第110节 整式的加减_第1张图片

[从头学数学] 第110节 整式的加减_第2张图片

[从头学数学] 第110节 整式的加减_第3张图片


经过一大堆的例子后,[人叫板老师]终于指出了一个叫做单项式的东西,这个单项式还有一些概念性的描述。

于是[工程师阿伟]就给[机器小伟]做了一个单项式的工具。


<span style="font-size:18px;">###
# @usage   单项式相关概念
# @author  mw
# @date    2016年02月26日  星期五  10:00:14 
# @param
# @return
#
###
#单项式
#可以有**, ^号,暂时只能处理代号为一个字母的式子,像x_1, x_n, ...这种还不能处理。
def monomial(s):
    #原始复本
    s0 = s;
    
    s = s.replace('**', '^');
    s = s.replace('*', '');

    if (s.find('+') != -1 or (s.find('-') != -1 and s.find('-')!=0)):
        print(s0, '不是单项式。');
        return;
        
    try:
        #系数
        sign = 1;
        if s[0] == '-':
            #负号
            sign = -1;
            s = s[1:];
        coefficient = 1;

        #字符串长度
        length = len(s);
        index = 0;
        while (not s[index].isalpha()):
            index+=1;
            if index >= length:
                index = length;
                break;

        if (index > 0):
            coefficient = float(s[:index]);
            if abs(int(coefficient)-coefficient) < 0.001:
                coefficient = int(coefficient);        
            s = s[index:];
            
        coefficient = sign * coefficient;
        #print(coefficient, s);

        length = len(s);
        array = [];
        if (length > 0):
            index = 0;
            index2 = 0;
            name = '';
            degree = 0;
            while index < length:        
                if s[index].isalpha():
                    if (name != ''):
                        array.append([name, degree]);
                        name = '';
                        degree = 0;
                    name = s[index];
                    degree = 1;
                    index += 1;
                else:
                    index2 = index;
                    tmp = '';
                    while (not s[index2].isalpha()):
                        index2+=1;
                        if (index2 >= length):
                            index2 = length;
                            break;
                    tmp = s[index:index2];
                    tmp = tmp.replace('^', '');
                    degree = float(tmp);
                    if abs(int(degree)-degree) < 0.001:
                        degree = int(degree);

                    index = index2;
            if (name != ''):
                array.append([name, degree]);
                name = '';
                degree = 0;
                
            #print(array);

            #所有字母,去除重复的
            setA = set();
            size = len(array);
            #单项式的次数
            totalDegree = 0;
            for i in range(size):
                setA.add(array[i][0]);
                totalDegree += array[i][1];

            listA = list(setA);
            listA.sort();
            size2 = len(listA);
            result = [];
            for i in range(size2):
                #计算每个字母的次数(degree)
                tmp = 0;
                for j in range(size):
                    if listA[i] == array[j][0]:
                        tmp += array[j][1];

                result.append([listA[i], tmp]);

            print('单项式{0} 的系数是{1}, 次数是{2},详细是{3}。'.format(\
                s0, coefficient, totalDegree, result));
        else:
            totalDegree = 0;
            if (coefficient != 0):
                print('单项式{0} 的系数是{1}, 次数是{2},'.format(\
                    s0, coefficient, 0));
            else:
                print('这个数是0, 暂无规定。');
        #返回单项式的次数
        return [coefficient, totalDegree, array];
    except:
        print(s0, '有误,无法正确计算。');</span>


话说牵扯到了手工的写法,所有的东西都不会太简单,既然工具出炉,还是看看怎么用吧,细节什么的就不用在意了。


来看看[人叫板老师]上面的例子:

<span style="font-size:18px;">if __name__ == '__main__':
    a = ['0.8p', 'mn', 'a3h', '-n', 'v+2.5', 'v-2.5',\
         '3x+5y+2z', '0.5ab-3.14r2', 'x2+2x+18'];

    for i in range(len(a)):
        monomial(a[i]);</span>

会得到些什么结论呢?

<span style="font-size:18px;">>>> 
单项式0.8p 的系数是0.8, 次数是1,详细是[['p', 1]]。
单项式mn 的系数是1, 次数是2,详细是[['m', 1], ['n', 1]]。
单项式a3h 的系数是1, 次数是4,详细是[['a', 3], ['h', 1]]。
单项式-n 的系数是-1, 次数是1,详细是[['n', 1]]。
v+2.5 不是单项式。
v-2.5 不是单项式。
3x+5y+2z 不是单项式。
0.5ab-3.14r2 不是单项式。
x2+2x+18 不是单项式。</span>

单项式还没有看仔细呢,多项式又出来了:

[从头学数学] 第110节 整式的加减_第4张图片

[从头学数学] 第110节 整式的加减_第5张图片


这个密码要放在平时,小伟还是想解一下的,但今天这层功法貌似很难,所以就放过它吧。


[从头学数学] 第110节 整式的加减_第6张图片


好了,现在知道了同类项和多项式,小伟就又有新工具了:

<span style="font-size:18px;">###
# @usage   多项式相关概念
# @author  mw
# @date    2016年02月26日  星期五  10:30:37 
# @param   如果有括号,需要先自行去除,
# @return
#
###
def polynomial(s):
    #预留复本
    s0 = s;

    #只能有+或-号连接各项,不能有括号,分数要先化成小数
    s = s.replace('-', '+-');
    if (s[0] == '+'):
        s = s[1:];
    #各项
    terms = s.split('+');
    

    print('多项式{0} 具有以下的项: {1}\n其中各单项分别是:'.format(s0, terms));

    try:
        size = len(terms);
        array = [];
        for i in range(size):
            #此处也可扩展单项的合法性检查。
            if (terms[i] == ''):
                pass;
            else:
                array.append(monomial(terms[i]));
        #print(array);

        size2 = len(array);

        for i in range(size2):
            #判断系数是否是0
            if array[i][0] == 0:
                continue;
            for j in range(i+1, size2):
                if array[j][0] == 0:
                    continue;
                else:
                    if (sameTerm(array[i], array[j])):
                        #合并同类项
                        array[i][0]+=array[j][0];
                        array[j][0] = 0;

        result = [];
        for i in range(size2):
            #判断系数是否是0
            if array[i][0] == 0:
                continue;
            else:
                result.append(array[i]);

        print('合并同类项后详细情况是:', result);
        sResult = '';
        size3 = len(result);
        for i in range(size3):
            tmp1 = result[i][0];
            if (tmp1 >= 0):
                if (tmp1 != 1):
                    sResult += '+'+str(tmp1);
                else:
                    sResult += '+';
            if (tmp1 < 0):
                if (tmp1!=-1):
                    sResult += str(tmp1);
                else:
                    sResult += '-';

            tmp2 = result[i][2];
            length = len(tmp2);
            for j in range(length):
                if tmp2[j][1] != 1:
                    sResult += tmp2[j][0]+str(tmp2[j][1]);
                else:
                    sResult += tmp2[j][0];
        if sResult[0] == '+':
            sResult = sResult[1:];
        print('合并同类项后是:{0}\n\n'.format(sResult));
    except:
        print(s0, '有误,无法进行多项式操作。');
    return;

                

#同类项判断
def sameTerm(a, b):
    #由于a, b具有以下格式[1, 1, [['v', 1]]] [系数, 次数, 详细元素]
    if (a[1] == 0 and b[1] == 0):
        return True;
    
    if (a[1] != b[1]):
        #次数不同
        return False;
    if (len(a[2]) != len(b[2])):
        #元素个数不同
        return False;

    a1 = a[2];
    b1 = b[2];
    size = len(a1);
    for i in range(size):
        if a1[i][0] != b1[i][0] or a1[i][1] != b1[i][1]:
            return False;

    return True;
        </span>

来试试新工具的效果吧。

[从头学数学] 第110节 整式的加减_第7张图片

<span style="font-size:18px;">>>> 
多项式4x2+2x+7+3x-8x2-2 具有以下的项: ['4x2', '2x', '7', '3x', '-8x2', '-2']
其中各单项分别是:
单项式4x2 的系数是4, 次数是2,详细是[['x', 2]]。
单项式2x 的系数是2, 次数是1,详细是[['x', 1]]。
单项式7 的系数是7, 次数是0,
单项式3x 的系数是3, 次数是1,详细是[['x', 1]]。
单项式-8x2 的系数是-8, 次数是2,详细是[['x', 2]]。
单项式-2 的系数是-2, 次数是0,
合并同类项后详细情况是: [[-4, 2, [['x', 2]]], [5, 1, [['x', 1]]], [5, 0, []]]
合并同类项后是:-4x2+5x+5

if __name__ == '__main__':
    a = ['4x2+2x+7+3x-8x2-2'];

    for i in range(len(a)):
        polynomial(a[i]);</span>

[从头学数学] 第110节 整式的加减_第8张图片

<span style="font-size:18px;">>>> 
多项式xy2-0.2xy2 具有以下的项: ['xy2', '-0.2xy2']
其中各单项分别是:
单项式xy2 的系数是1, 次数是3,详细是[['x', 1], ['y', 2]]。
单项式-0.2xy2 的系数是-0.2, 次数是3,详细是[['x', 1], ['y', 2]]。
合并同类项后详细情况是: [[0.8, 3, [['x', 1], ['y', 2]]]]
合并同类项后是:0.8xy2


多项式-3x2y+2x2y+3xy2-2xy2 具有以下的项: ['-3x2y', '2x2y', '3xy2', '-2xy2']
其中各单项分别是:
单项式-3x2y 的系数是-3, 次数是3,详细是[['x', 2], ['y', 1]]。
单项式2x2y 的系数是2, 次数是3,详细是[['x', 2], ['y', 1]]。
单项式3xy2 的系数是3, 次数是3,详细是[['x', 1], ['y', 2]]。
单项式-2xy2 的系数是-2, 次数是3,详细是[['x', 1], ['y', 2]]。
合并同类项后详细情况是: [[-1, 3, [['x', 2], ['y', 1]]], [1, 3, [['x', 1], ['y', 2]]]]
合并同类项后是:-x2y+xy2


多项式4a2+3b2+2ab-4a2-4b2 具有以下的项: ['4a2', '3b2', '2ab', '-4a2', '-4b2']
其中各单项分别是:
单项式4a2 的系数是4, 次数是2,详细是[['a', 2]]。
单项式3b2 的系数是3, 次数是2,详细是[['b', 2]]。
单项式2ab 的系数是2, 次数是2,详细是[['a', 1], ['b', 1]]。
单项式-4a2 的系数是-4, 次数是2,详细是[['a', 2]]。
单项式-4b2 的系数是-4, 次数是2,详细是[['b', 2]]。
合并同类项后详细情况是: [[-1, 2, [['b', 2]]], [2, 2, [['a', 1], ['b', 1]]]]
合并同类项后是:-b2+2ab

if __name__ == '__main__':
    a = ['xy2-0.2xy2', '-3x2y+2x2y+3xy2-2xy2', '4a2+3b2+2ab-4a2-4b2'];

    for i in range(len(a)):
        polynomial(a[i]);</span>

[从头学数学] 第110节 整式的加减_第9张图片



<span style="font-size:18px;">>>> 
多项式8a+2b+5a-b 具有以下的项: ['8a', '2b', '5a', '-b']
其中各单项分别是:
单项式8a 的系数是8, 次数是1,详细是[['a', 1]]。
单项式2b 的系数是2, 次数是1,详细是[['b', 1]]。
单项式5a 的系数是5, 次数是1,详细是[['a', 1]]。
单项式-b 的系数是-1, 次数是1,详细是[['b', 1]]。
合并同类项后详细情况是: [[13, 1, [['a', 1]]], [1, 1, [['b', 1]]]]
合并同类项后是:13a+b


多项式5a-3b-3a2+6b 具有以下的项: ['5a', '-3b', '-3a2', '6b']
其中各单项分别是:
单项式5a 的系数是5, 次数是1,详细是[['a', 1]]。
单项式-3b 的系数是-3, 次数是1,详细是[['b', 1]]。
单项式-3a2 的系数是-3, 次数是2,详细是[['a', 2]]。
单项式6b 的系数是6, 次数是1,详细是[['b', 1]]。
合并同类项后详细情况是: [[5, 1, [['a', 1]]], [3, 1, [['b', 1]]], [-3, 2, [['a', 2]]]]
合并同类项后是:5a+3b-3a2

if __name__ == '__main__':
    a = ['8a+2b+5a-b', '5a-3b-3a2+6b'];

    for i in range(len(a)):
        polynomial(a[i]);</span>



<span style="font-size:18px;">>>> 
多项式2x-3y+5x+4y 具有以下的项: ['2x', '-3y', '5x', '4y']
其中各单项分别是:
单项式2x 的系数是2, 次数是1,详细是[['x', 1]]。
单项式-3y 的系数是-3, 次数是1,详细是[['y', 1]]。
单项式5x 的系数是5, 次数是1,详细是[['x', 1]]。
单项式4y 的系数是4, 次数是1,详细是[['y', 1]]。
合并同类项后详细情况是: [[7, 1, [['x', 1]]], [1, 1, [['y', 1]]]]
合并同类项后是:7x+y


多项式8a-7b-4a+5b 具有以下的项: ['8a', '-7b', '-4a', '5b']
其中各单项分别是:
单项式8a 的系数是8, 次数是1,详细是[['a', 1]]。
单项式-7b 的系数是-7, 次数是1,详细是[['b', 1]]。
单项式-4a 的系数是-4, 次数是1,详细是[['a', 1]]。
单项式5b 的系数是5, 次数是1,详细是[['b', 1]]。
合并同类项后详细情况是: [[4, 1, [['a', 1]]], [-2, 1, [['b', 1]]]]
合并同类项后是:4a-2b

if __name__ == '__main__':
    a = ['2x-3y+5x+4y', '8a-7b-4a+5b'];

    for i in range(len(a)):
        polynomial(a[i]);
</span>

[从头学数学] 第110节 整式的加减_第10张图片

<span style="font-size:18px;">>>> 
多项式2ab+2bc+2ca+6ab+8bc+6ca 具有以下的项: ['2ab', '2bc', '2ca', '6ab', '8bc', '6ca']
其中各单项分别是:
单项式2ab 的系数是2, 次数是2,详细是[['a', 1], ['b', 1]]。
单项式2bc 的系数是2, 次数是2,详细是[['b', 1], ['c', 1]]。
单项式2ca 的系数是2, 次数是2,详细是[['a', 1], ['c', 1]]。
单项式6ab 的系数是6, 次数是2,详细是[['a', 1], ['b', 1]]。
单项式8bc 的系数是8, 次数是2,详细是[['b', 1], ['c', 1]]。
单项式6ca 的系数是6, 次数是2,详细是[['a', 1], ['c', 1]]。
合并同类项后详细情况是: [[8, 2, [['a', 1], ['b', 1]]], [10, 2, [['b', 1], ['c', 1]]], [8, 2, [['c', 1], ['a', 1]]]]
合并同类项后是:8ab+10bc+8ca


多项式6ab+8bc+6ca-2ab-2bc-2ca 具有以下的项: ['6ab', '8bc', '6ca', '-2ab', '-2bc', '-2ca']
其中各单项分别是:
单项式6ab 的系数是6, 次数是2,详细是[['a', 1], ['b', 1]]。
单项式8bc 的系数是8, 次数是2,详细是[['b', 1], ['c', 1]]。
单项式6ca 的系数是6, 次数是2,详细是[['a', 1], ['c', 1]]。
单项式-2ab 的系数是-2, 次数是2,详细是[['a', 1], ['b', 1]]。
单项式-2bc 的系数是-2, 次数是2,详细是[['b', 1], ['c', 1]]。
单项式-2ca 的系数是-2, 次数是2,详细是[['a', 1], ['c', 1]]。
合并同类项后详细情况是: [[4, 2, [['a', 1], ['b', 1]]], [6, 2, [['b', 1], ['c', 1]]], [4, 2, [['c', 1], ['a', 1]]]]
合并同类项后是:4ab+6bc+4ca


if __name__ == '__main__':
    a = ['2ab+2bc+2ca+6ab+8bc+6ca', '6ab+8bc+6ca-2ab-2bc-2ca'];

    for i in range(len(a)):
        polynomial(a[i]);</span>

[从头学数学] 第110节 整式的加减_第11张图片

<span style="font-size:18px;">>>> 
多项式0.5x-2x+0.67y2-1.5x+0.33y2 具有以下的项: ['0.5x', '-2x', '0.67y2', '-1.5x', '0.33y2']
其中各单项分别是:
单项式0.5x 的系数是0.5, 次数是1,详细是[['x', 1]]。
单项式-2x 的系数是-2, 次数是1,详细是[['x', 1]]。
单项式0.67y2 的系数是0.67, 次数是2,详细是[['y', 2]]。
单项式-1.5x 的系数是-1.5, 次数是1,详细是[['x', 1]]。
单项式0.33y2 的系数是0.33, 次数是2,详细是[['y', 2]]。
合并同类项后详细情况是: [[-3.0, 1, [['x', 1]]], [1.0, 2, [['y', 2]]]]
合并同类项后是:-3.0x+y2

if __name__ == '__main__':
    a = ['0.5x-2x+0.67y2-1.5x+0.33y2'];

    for i in range(len(a)):
        polynomial(a[i]);</span>

[从头学数学] 第110节 整式的加减_第12张图片

<span style="font-size:18px;">#7
S = 4a2+3.14*a2*0.5
C = 2a*3+3.14*a 
#8
L = (a+y)*3+(a-y)*1.5
#9
C = 2a+n*3a </span>

[从头学数学] 第110节 整式的加减_第13张图片

[从头学数学] 第110节 整式的加减_第14张图片

[从头学数学] 第110节 整式的加减_第15张图片

<span style="font-size:18px;">>>> 100*2.3/2.2
104.54545454545452</span>

也就是说买104本的花费比买100本还要少。


[从头学数学] 第110节 整式的加减_第16张图片

<span style="font-size:18px;">function myDraw() { 
	
    var config = new PlotConfiguration();    
    config.init();    
    config.setPreference();   
	config.setSector(1,1,1,1);
	config.axis2D(0, 0, 180);

	var array = [];

	for (var i = 0; i <=100; i++) {
		array.push([i, -2.3*i/2]);
	}
	
	for (var i = 101; i < 200; i++) {
		array.push([i, -2.2*i/2]);
	}
	
	shape.multiLineDraw(array, 'red');
	

}</span>


这种所有数都相差相同的值的情况,小伟现在也不想仔细看了。


不过,刚才改进了一下同类项的判断,现在像4ca, 4ac这种,就会被判定为同类项了:

<span style="font-size:18px;">#同类项判断
def sameTerm(a, b):
    #由于a, b具有以下格式[1, 1, [['v', 1]]] [系数, 次数, 详细元素]
    if (a[1] == 0 and b[1] == 0):
        return True;
    
    if (a[1] != b[1]):
        #次数不同
        return False;
    if (len(a[2]) != len(b[2])):
        #元素个数不同
        return False;

    a1 = list(a[2]);
    b1 = list(b[2]);
    a1 = sorted(a1, key=lambda num:num[0]);
    b1 = sorted(b1, key=lambda num:num[0]);
    size = len(a1);
    for i in range(size):
        if a1[i][0] != b1[i][0] or a1[i][1] != b1[i][1]:
            return False;

    return True;</span>


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

你可能感兴趣的:([从头学数学] 第110节 整式的加减)