C语言编写杨辉三角(二维数组方法)

C语言实现杨辉三角(二维数组)

杨辉三角是什么

杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。(这里中国的老祖宗还是很厉害的)

实现效果

默认状态下不使用金字塔或者菱形,多半采用正三角输出
默认状态下不使用金字塔或者菱形输出,多半采用正三角形

题目分析

  1. 整体上看这是一个正三角行,行和列数是相等的;
  2. 继续会发现,第一列和对角线上的数字全为1。在二维数组中就可以用(i==0)和(i==j)来分别表示第一列和对角线,这是只要在这个条件下输出为1就可以;
  3. 深入研究图形后,我们会看到第i行第j列的数字是由第i-1行第j列的数字加上第i-1行第j-1列的数字构成的,在二位数组里面就是**假设数组名称是array,那么换成代码表示就是array[i][j]=a[i-1][j]+a[i-1][j-1],这个式子是二维数组解决杨辉三角的核心;
  4. 最后完成杨辉三角的构建后,我们还需要将其输出出来,也就是用循环嵌套输出二维数组(我相信这一步没有任何难度)。

代码实现

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
    int a[100][100];
    int i,j;
    int n;
    printf("请输入行数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    	for(j=0;j<=i;j++)
    	{
    		if(j==0 || i==j)//在第一列或者在对角线上
    		{
    			a[i][j]=1;
    		}
    		else
    		{
    			a[i][j]=a[i-1][j]+a[i-1][j-1];
    		}
    	}
    }
    //输出杨辉三角
    for(i=0;i<n;i++)
    {
    	for(j=0;j<=i;j++)
    	{
    		printf("%d\t",a[i][j]);
    	}
    	printf("\n");
    }
    
}

只有二维数组这一种方法吗?

当然不是,这是笔者喜欢使用的一种实现杨辉三角的方法,在这里给大家分享,但是杨辉三角还有另一种常见实现方式,那就是递归的方式。还可以用二维数组但不使用循环嵌套而使用递归的方法。总之,达到目的有很多种,但是一定要选择最适合自己的一种。

其他语言的实现方式

笔者阅读了其他多种语言的杨辉三角实现方法,包含了C++、Java、Python、C#、Bash,这里也给大家呈现一下:

C++

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    const int n = 15;
    const int m = 2 * n-1;
    int arr[n + 1][m] = { 0 };
    for (int i = 0; i < n; i++)
    {
        arr[i][n - i- 1] = 1;
        arr[i][n + i -1] = 1;
 
    }
    for (int i = 2; i < n; i++)
    {
        for (int j = n - i + 1; j < n-2+i; j = j + 2)
            arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j + 1];
    }
    int p;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n - i - 1; j++)
            cout << "    ";
        p = 1;
        for (int j = n - i - 1; p < i + 2; j = j + 2)
        {
            cout << setw(4) << arr[i][j] << "    ";
            p = p + 1;
        }
        cout << endl;
    }
    return 0;
}

Java

public class TriangleArray
{
   public static void main(String[] args)
   {
      final int NMAX = 10; 
 
      // allocate triangular array
      int[][] odds = new int[NMAX + 1][];
      for (int n = 0; n <= NMAX; n++)
         odds[n] = new int[n + 1];  
 
      // fill triangular array
      for (int n = 0; n < odds.length; n++)
         for (int k = 0; k < odds[n].length; k++)
         {
            /*
             * compute binomial coefficient n*(n-1)*(n-2)*...*(n-k+1)/(1*2*3*...*k)
             */
            int lotteryOdds = 1;
            for (int i = 1; i <= k; i++)
               lotteryOdds = lotteryOdds * (n - i + 1) / i;
 
            odds[n][k] = lotteryOdds;
         }
 
      // print triangular array
      for (int[] row : odds)
      {
         for (int odd : row)
            System.out.printf("%4d", odd);
         System.out.println();
      }
   }
}

C#

class Program
{
  public int yanghui(int value)
  {
  if(value<3) return 1;
  int[,]arry=new int[value,value];
  Console.WriteLine("数组为:");
  for(int i=0;i<value;i++)
  {
    string str="";
    str=str.PadLeft(value-i);
    Console.Write(str);
    for(int j=0;j<=i;j++)
    {
      if(i==j||j==0)
        arry[i,j]=1;
      else
        arry[i,j]=arry[i-1,j-1]+arry[i-1,j];
      Console.Write(arry[i,j]+"");
    }
    Console.WriteLine();
  }
}
  
static void Main(string[]args)
{
  Program p=new Program();
  Console.WriteLine("请输入数组值:");
  if (p.yanghui(Convert.ToInt16(Console.ReadLine())))
    Console.WriteLine("输入数值必须大于3");
  Console.Readkey();
}
  
}

Python

# -*- coding: utf-8 -*-
#!/usr/bin/env python
def triangles():
    L = [1]
    while True:
        yield L
        L = [sum(i) for i in zip([0]+L, L+[0])]
该方式用到了列表生成式,理解起来较困难,下面是另一种方式:

def triangles():
    ret = [1]
    while True:
        yield ret
        for i in range(1, len(ret)):
            ret[i] = pre[i] + pre[i - 1]
        ret.append(1)
        pre = ret[:]

PHP

<?php
$max = 10;
$L = [1];
var_dump($L);
$L = [1,1];
var_dump($L);
$n = 2;
while ($n <= $max - 1){
    $oldL = $L;
    $L[$n] = 1;
    $n++;
    for ($i = 1;$i <count($oldL);$i++){
        $L[$i] = $oldL[$i-1] + $oldL[$i];
    }
    var_dump($L);
}
?>

我们可以清晰的看到,Python语言是多种语言里最方便的代码量最少的,所以大家可以跟着我一起学习Python(同时笔者也在教授高中生Python),在学习Python的过程中,笔者会经常给大家更新和讲解一些经典案例,关注我吧!!

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页