[从头学数学] 第195节 计数原理

剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第五转的修炼。
这次要研究的是[计数原理]。

正剧开始:

星历2016年04月25日 10:22:16, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[计数原理]。


[从头学数学] 第195节 计数原理_第1张图片


[从头学数学] 第195节 计数原理_第2张图片

[从头学数学] 第195节 计数原理_第3张图片


[从头学数学] 第195节 计数原理_第4张图片


<span style="font-size:18px;">	if (1) {  
        var r = 20;            
        config.setSector(1,10,1,1.5);              
        config.graphPaper2D(0, 0, r);            
        config.axis2D(0, 0,180, 2.8);              
                
        //坐标轴设定        
        var scaleX = 2*r, scaleY = 2*r;          
        var spaceX = 1, spaceY = 1;           
        var xS = -10, xE = 10;          
        var yS = -10, yE = 10;          
        config.axisSpacing(xS, xE, spaceX, scaleX, 'X');            
        config.axisSpacing(yS, yE, spaceY, scaleY, 'Y');         
              
		var array2D = [[0, 0]];
		
		for (var i = 2; i <=10; i+=2) {
			for (var j = -3; j <=3; j+=3) {
				array2D.push([i, j]);
			}
		}
          
		array2D.push([12, 0]);
          
        //去除重复点    
        var pointArray = removeDuplicatedPoint(array2D);    
        //无重复的点的数量    
        var points = pointArray.length;    
            
        //得到距离阵列    
        //格式为[[点1序号,点2序号, 距离值], ...]    
        var distanceArray = distanceSort(pointArray);    
        //边的数量    
        var edges = distanceArray.length;    
            
        //存放需要连通的边    
        var linkedArray = [];    
        //连通的边的数量    
        var links = 0;    
            
        //每个顶点相关的边的集合    
        var edgeOfVertex = [];    
            
        for (var i = 0; i < points; i++) {    
                
                
            //获得顶点相关的边的集合    
            edgeOfVertex = [];    
            for (var j = 0; j < edges; j++) {    
                if (distanceArray[j][0] == i ||    
                    distanceArray[j][1] == i) {    
                    edgeOfVertex.push(distanceArray[j]);    
                }    
            }    
                
            //根据起始点寻找最短长度的两条边    
            edgeOfVertex.sort(function(a, b) {    
                return a[2] - b[2];    
            });    
                
            var choice = 3;    
            if (edgeOfVertex.length > choice) {    
                edgeOfVertex = edgeOfVertex.slice(0, choice);    
            }    
                
            linkedArray = linkedArray.concat(edgeOfVertex);    
        }    
            
            
        //document.write(linkedArray.join(' , ')+'<br/>');    
        linkedArray = removeDuplicatedPoint(linkedArray);    
        links = linkedArray.length;    
            
        //document.write(linkedArray.join(' , ')+'<br/>');        
            
        var startPoint, endPoint, x1, y1, x2, y2;    
        //比例缩放    
        var scale = scaleX/spaceX;    
            
        for (var i = 0; i < links; i++) {    
            startPoint = linkedArray[i][0];    
            endPoint = linkedArray[i][1];    
            x1 = pointArray[startPoint][0];    
            y1 = pointArray[startPoint][1];    
            x2 = pointArray[endPoint][0];    
            y2 = pointArray[endPoint][1];    
                
            shape.vectorDraw([[x1,y1], [x2, y2]], 'red', scale);    
        }    
          
        shape.pointDraw(pointArray, 'blue', scale, 1, 'OABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz');  
          
    

          
    }</span>


[从头学数学] 第195节 计数原理_第5张图片


[从头学数学] 第195节 计数原理_第6张图片

小伟一直以来都想算一下车牌号容量,以了解某些地方为什么要限牌。

先看车牌编码规则:


代表该车所在地的地市一级代码,规律一般是这样的,A是省会,B是该省第二大城市,C是
该省第三大城市,依此类推。 车牌号的第一个是汉字:代表该车户口所在省的简称:如四
川就是川,北京就是京,重庆就是渝,上海就是沪......,第二个是英文:代表该车所在
地的地市一级代码,规律一般是这样的,A是省会,B是该省第二大城市,C是该省第三大城
市,依此类推。然后就是后五位啦,这后五位是这样的规律,如果你是第一个在该省该地
区上的第一个车牌,从理论上讲你车牌后五位就是00001,如果你是第8965位车主,你的车
牌的后五位理论上就应该是08965,如果车牌超过了数字的容量就是第100000万位时,就从
第一位开始用字母A,后面用0001至9999,用完后第一位改成B再跟0001至9999,依此类推
,也就是说如果车牌号越大说明车越新,前面的英文字母越靠后,说明车越新,这就是一
般规律。黄色牌号代表大车,兰牌代表小车,黑牌代表外资企业或者是大使馆的车,军车的
牌号是按军队的编法编的,与地方车不一样,但是都是白底红字,警车与地方车编法基本
相同,只是最后位数字不是数字而是改成了红色的警字。


这是小伟的初步估算:


<span style="font-size:18px;">#省名+市代号+5位数字,且第一位可以用字母
#不考虑有字母保留的情况
>>> 36*9999
359964

#第二位也可以用字母
>>> 26*26*999+99999
775323

#后五位中的两个字母可以随意放,但必须连续
>>> 4*26*26*999+99999
2801295

#后五位中的两个字母可以随意放,且可以不连续
>>> 10*26*26*999+99999
6853239</span>

也就是说如果满足上述的限制条件,一个城市最多只能有不到700万台车。

如果这个城市面积1000平方公里,每平方公里就有车7000辆。

随便往哪一站,眼睛一定能看到车。


只是这个计算事实上没有什么意义,发不发牌这事。。。


[从头学数学] 第195节 计数原理_第7张图片

[从头学数学] 第195节 计数原理_第8张图片

<span style="font-size:18px;">>>> 
[[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], [1, 3, 4, 2], [1, 4, 2, 3], [1, 4, 3, 2], [2, 1, 3, 4], [2, 1, 4, 3], [2, 3, 1, 4], [2, 3, 4, 1], [2, 4, 1, 3], [2, 4, 3, 1], [3, 1, 2, 4], [3, 1, 4, 2], [3, 2, 1, 4], [3, 2, 4, 1], [3, 4, 1, 2], [3, 4, 2, 1], [4, 1, 2, 3], [4, 1, 3, 2], [4, 2, 1, 3], [4, 2, 3, 1], [4, 3, 1, 2], [4, 3, 2, 1]]

def perm(array):
    if (len(array)<=1):
        return [array];

    r = [];
    for i in range(len(array)):
        #抽去array[i]
        s = array[:i]+array[i+1:];
        p = perm(s);
        for x in p:
            #array[i]置顶
            r.append(array[i:i+1]+x);
    return r;


def tmp():
    print(perm([1,2,3,4]));</span>



<span style="font-size:18px;">#排列公式
def arrangement(n, m):
    if n < m:
        return arrangement(m, n);
    else:
        factorial = 1;
        for i in range(n, n-m, -1):
            factorial*=i;
        return factorial;
    
def tmp():
    print(arrangement(10, 4));
    print(arrangement(18, 5));
    print(arrangement(18, 18)/arrangement(13, 13));</span>

[从头学数学] 第195节 计数原理_第9张图片

[从头学数学] 第195节 计数原理_第10张图片

[从头学数学] 第195节 计数原理_第11张图片


<span style="font-size:18px;">>>> 
182
648

def tmp():
    print(arrangement(14,2));
    print(9*arrangement(9,2));</span>


[从头学数学] 第195节 计数原理_第12张图片


<span style="font-size:18px;">>>> 
45.0
90

#排列公式
def arrangement(n, m):
    if n < m:
        return arrangement(m, n);
    else:
        factorial = 1;
        for i in range(n, n-m, -1):
            factorial*=i;
        return factorial;

#组合公式
def combination(n, m):
    if (n < m):
        return combination(m, n);
    else:
        return arrangement(n, m)/arrangement(m,m);
    
def tmp():
    print(combination(10,2));
    print(arrangement(10,2));</span>

[从头学数学] 第195节 计数原理_第13张图片

[从头学数学] 第195节 计数原理_第14张图片

[从头学数学] 第195节 计数原理_第15张图片

<span style="font-size:18px;">>>> 
[64.0, -192.0, 240.0, -160.0, 60.0, -12.0, 1.0]

#排列公式
def arrangement(n, m):
    if n < m:
        return arrangement(m, n);
    else:
        factorial = 1;
        for i in range(n, n-m, -1):
            factorial*=i;
        return factorial;

#组合公式
def combination(n, m):
    if (n < m):
        return combination(m, n);
    else:
        return arrangement(n, m)/arrangement(m,m);
    
def tmp():
    a = [2, -1];
    N = 6;

    coefficient = [];

    for i in range(N+1):
        coefficient.append(a[0]**(N-i)*a[1]**i*combination(N, i));

    print(coefficient);</span>


[从头学数学] 第195节 计数原理_第16张图片


<span style="font-size:18px;">>>> 
[1.0, 14.0, 84.0, 280.0, 560.0, 672.0, 448.0, 128.0]

def tmp():
    a = [1, 2];
    N = 7;

    coefficient = [];

    for i in range(N+1):
        coefficient.append(a[0]**(N-i)*a[1]**i*combination(N, i));

    print(coefficient);
	
>>> 
[1.0, -9.0, 36.0, -84.0, 126.0, -126.0, 84.0, -36.0, 9.0, -1.0]

def tmp():
    a = [1, -1];
    N = 9;

    coefficient = [];

    for i in range(N+1):
        coefficient.append(a[0]**(N-i)*a[1]**i*combination(N, i));

    print(coefficient);</span>
[从头学数学] 第195节 计数原理_第17张图片


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


你可能感兴趣的:([从头学数学] 第195节 计数原理)