【自学java笔记#第十天#】Java的基本程序设计结构

选用教材:《Java核心技术卷一》

第三章 Java的基本程序设计结构

3.10.8 不规则数组

书上的习题有一道是从n个数里面抽取k个数,计算你的中奖概率。

一般情况下,如果从n个数字中抽取k个数,就会有:

n×(n-1)×(n-2)×(n-3)×......×(n-k+1)/1×2×3×......×k种可能性。

因为k总是不大于n,所以把这些所有的可能性放在数组里,它会是一个三角形数组,如下:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1 

1、按照常规的套公式解法,如下:

package array;

public class IrregularArray 
{
	public static void main(String[] args)
	{
		final int NMAX = 10;
		int [] [] odds = new int[NMAX+1][]; //创建一个二维数组
		for (int n=0;n<=NMAX;n++)
		{
			odds[n]=new int[n+1];  //搭建三角形框架
		}
		
		for(int n=0;n<odds.length;n++)
		{
			for(int k=0;k<odds[n].length;k++)
			{
				int lotterOdds=1;
				for(int i=1;i<=k;i++)
				{
					lotterOdds = lotterOdds*(n-i+1)/i;
					odds[n][k]=lotterOdds;  //把数据一个个放进数组
				}
				
			}
		}
		for(int[] row:odds)
		{
			for(int odd:row)
				System.out.printf("%4d",odd);    //遍历输出数组所有元素
			System.out.println();            
		}
	}

}

  得到的结果为:

   0
   0   1
   0   2   1
   0   3   3   1
   0   4   6   4   1
   0   5  10  10   5   1
   0   6  15  20  15   6   1
   0   7  21  35  35  21   7   1
   0   8  28  56  70  56  28   8   1
   0   9  36  84 126 126  84  36   9   1
   0  10  45 120 210 252 210 120  45  10   1

2、还有一种比较取巧、不套公式的解题方法:

观察题目事先给出的三角形数组,可以得知这些数组元素满足一个规律:

当行下标(i)和列下标(j)都大于0时,numbers[i][j] =numbers[i-1][j-1] +numbers[i-1][j]. //假设numbers[][]是题中的三角形数组

所以代码也可以这么写:

package array;

public class IrregularArray 
{
    public static void main(String[] args)
    {
        final int ROWS = 7;
        final int COLUMS = 7;
        int [][] trianglearrays = new int [ROWS][COLUMS];  //创建一个大小已定的二维数组
        for (int r=0;r<ROWS;r++)
        {
            trianglearrays[r][0] = 1;     //将第一行的元素装入数组
        }
        for (int c=0;c<COLUMS;c++)
        {
            trianglearrays[c][c] = 1;     //将行列下标相等的元素装入数组
        }
        for(int c1=1;c1<trianglearrays[0].length;c1++)
        {
            for (int r1=1;r1<trianglearrays.length;r1++)
            {
                if(c1!=r1)
                {
                    trianglearrays[r1][c1]=trianglearrays[r1-1][c1-1]+trianglearrays[r1-1][c1];   //套数学规律装入其他元素
                }
            }
        }
        
        for (int [] row:trianglearrays)
        {
            for (int b:row)
                System.out.printf("%4d ",b);     //遍历输出数组元素
            System.out.println();
        }
        
    }

}

得到的结果为:

1 0 0 0 0 0 0
1 1 0 0 0 0 0
1 2 1 0 0 0 0
1 3 3 1 0 0 0
1 4 6 4 1 0 0
1 5 10 10 5 1 0
1 6 15 20 15 6 1

3、忽略系统自动在空位填入的0的话,两种编程方式都是可取的。第一种方式里,实现搭建一个三角形框架的做法确实很新颖。这也说明:写代码并不只是做数学规律题,还要结合编码工具、数据结构特点等,来力求代码展现出最好的效果。

猜你喜欢

转载自www.cnblogs.com/yizhinailu/p/12465258.html