趣味C程序100.9 绘制杨辉三角

说明:1.本问题来源于《C语言经典、趣味、实用程序设计编程百例精解》,所有程序为本人自己编写。与原程序不同之处作有标记。

        2.本系列所有程序均使用codeblocks编译,操作系统为Windows XP。

问题:在屏幕上显示杨辉三角

            1

          1  1

       1   2  1

    1   3   3  1

  1  4   6   4  1

1  5  10 10  5  1

………………………………

分析:我以图形的特点出发,设计两个数组,循环输出,代码如下。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i=0, j=0;
    int a[20]={0}, b[20]={0};
    a[0]=1;
    int rows=1;

    printf("Please input rows: ");
    scanf("%d", &rows);    //控制输出多少行

    for(i=1; i<=rows; i++)
    {
        for(j=0; j<rows-i; j++) //控制输出每行前的空格
        {
            printf("  ");
        }

        for(j=0; j<rows; j++)//将数组a复制给数组b
        {
            b[j] = a[j];
        }

        for(j=1; j<=i-1; j++) //通过数组b给下一行赋值
        {
            a[j] = b[j-1] + b[j];
        }

        for(j=0; j<rows; j++) //输出新一行数组a
        {
            if(a[j]!=0)
                printf("%4d", a[j]);
        }

        printf("\n");
    }

    return 0;
}

输出情况如下:

图1

原书分析如下:

      杨辉三角中的数,正是(x+y)的N次幂展开式的各项的系数。从杨辉三角的特点出发,可以总结出:

1)第N行有N+1个值(设起始行为0行);

2)对于第N行的第J个值:(N>=2);

当J=1时或J=N+1时:其值为1;

J!=1且J!=N+1时:其值为第N-1行的第J-1个值和第J个值的和。

      将如上特点提炼成数学公式可表示为:

1  x=1或x=N+1

c(x,y)=c(x-1,y-1)+c(x-1,y)

#include <stdio.h>
#include <stdlib.h>

int YangHui(int x,int y);

int main(void)
{
    int i, j, n=13;
    printf("N=");
    while(n>12)
        scanf("%d", &n); //控制输入正确的值以保证屏幕显示的图形正确

    for(i=0; i<=n; i++) //控制输出N行
    {
        for(j=0; j<24-2*i; j++)
            printf(" "); //控制输出第i行前的空格

        for(j=1; j<i+2; j++)
            printf("%4d", YangHui(i, j)); //输出第i行的第j个值

        printf("\n");
    }

    return 0;
}

int YangHui(int x, int y)
{
    int z;
    if((y==1)||(y==x+1))
        return 1;

    z=YangHui(x-1,y-1)+YangHui(x-1, y);
    return z;
}

输出情况如下:

图2

 

posted @ 2015-03-05 17:52  龙格泽月  阅读(581)  评论(0编辑  收藏  举报