签到

06月21日
尚未签到

共有回帖数 0

    愤怒的鸟

    等级:
    杨辉三角形是形如
    1
    1  1
    1  2  1
    1  3  3  1
    1  4  6  4  1
    的三角形,其实质是二项式(a+b)的n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。这个题目常用于程序设计的练习。
    下面给出六种不同的解法。
    解法一
    #include  stdio.h
    main()
    { int i,j,n=0,a[17][17]={0};
     while(n1 || n16)
     { printf("请输入杨辉三角形的行数:");
       scanf("%d",&n);
     }
     for(i=0;in;i++)
       a[0]=1;      /*第一列全置为一*/
     for(i=1;in;i++)
       for(j=1;j=i;j++)
         a[j]=a[i-1][j-1]+a[i-1][j];/*每个数是上面两数之和*/
     for(i=0;in;i++)   /*输出杨辉三角*/
     { for(j=0;j=i;j++)
         printf("%5d",a[j]);
       printf("n");
     }
    }
    点评:解法一是一般最容易想到的解法,各部分功能独立,程序浅显易懂。
    解法二
    #include  stdio.h
    main()
    { int i,j,n=0,a[17][17]={1};
     while(n1 || n16)
     { printf("请输入杨辉三角形的行数:");
       scanf("%d",&n);
     }
     for(i=1;in;i++)
     { a[0]=1;             /*第一列全置为一*/
       for(j=1;j=i;j++)
         a[j]=a[i-1][j-1]+a[i-1][j];  /*每个数是上面两数之和*/
     }
       for(i=0;in;i++)           /*输出杨辉三角*/
       { for(j=0;j=i;j++)
           printf("%5d",a[j]);
         printf("n");
       }
    }
    点评:解窢二是在解法一的基础上,把第一列置为1的命令移到下面的双重循环中,减少了一个循环。注意初始化数组的变化。
    解法三
    #include  stdio.h
    main()
    { int i,j,n=0,a[17][17]={0,1};
     while(n1 || n16)
     { printf("请输入杨辉三角形的行数:");
       scanf("%d",&n);
     }
     for(i=1;i=n;i++)
     for(j=1;j=i;j++)
       a[j]=a[i-1][j-1]+a[i-1][j];  /*每个数是上面两数之和*/
     for(i=1;i=n;i++)          /*输出杨辉三角*/
     { for(j=1;j=i;j++) printf("%5d",a[j]);
        printf("n");
     }
    }
    点评:解法三是在解法一、二的基础上,把第一列置为1的命令去掉了,注意初始化数组的变化。
    解法四
    #include  stdio.h
    main()
    { int i,j,n=0,a[17][17]={0,1};
     while(n1 || n16)
     { printf("请输入杨辉三角形的行数:");
       scanf("%d",&n);
     }
     for(i=1;i=n;i++)
     { for(j=1;j=i;j++)
       { a[j]=a[i-1][j-1]+a[i-1][j];  /*每个数是上面两数之和*/
         printf("%5d",a[j]);   /*输出杨辉三角*/
       }
       printf("n");
     }
    }
    点评:解法四是在解法三的基础上,把计算和打印合并在一个双重循环中。
    解法五
    #include stdio.h
    main()
    { int i,j,n=0,a[17]={1},b[17];
     while(n1 || n16)
     { printf("请输入杨辉三角形的行数:");
       scanf("%d",&n);
     }
     for(i=0;in;i++)
     { b[0]=a[0];
       for(j=1;j=i;j++)
          b[j]=a[j-1]+a[j];  /*每个数是上面两数之和*/
       for(j=0;j=i;j++)           /*输出杨辉三角*/
       { a[j]=b[j];  /*把算得的新行赋给a,用于打印和下一次计算*/
         printf("%5d",a[j]);
       }
       printf("n");
     }
    }
    点评:解法一到解法四都用了二维数组,占用的空间较多。而解法五只使用了两个一维数组。
    解法六
    #include  stdio.h
    main()
    { int i,j,n=0,a[17]={0,1},l,r;
     while(n1 || n16)
     { printf("请输入杨辉三角形的行数:");
       scanf("%d",&n);
     }
     for(i=1;i=n;i++)
     { l=0;
       for(j=1;j=i;j++)
       { r=a[j];
         a[j]=l+r;  /*每个数是上面两数之和*/
         l=r;
         printf("%5d",a[j]);  /*输出杨辉三角*/
       }
       printf("n");
     }
    }
    点评:解法六只使用了一个一维数组和两个临时变量。


    楼主 2016-02-12 14:42 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知