Board logo

标题: 批处理脚本实现C语言趣味编程百例009:杨辉三角形 [打印本页]

作者: HAT    时间: 2012-3-15 23:02     标题: 批处理脚本实现C语言趣味编程百例009:杨辉三角形

要求用BAT脚本实现:在屏幕上显示杨辉三角形
              1
            1 1
          1 2 1
         1 3 3 1
        1 4 6 4 1
     1 5 10 10 5 1

加分:1个技术分或者10个PB

*问题分析与算法设计
杨辉三角形中的数,正是(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个值与第N-1行第J个值
之和
将这些特点提炼成数学公式可表示为:
1 x=1或x=N+1
c(x,y)=
c(x-1,y-1)+c(x-1,y) 其它

本程序应是根据以上递归的数学表达式编制的。
*程序说明与注释
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int i,j,n=13;
  5. printf("N=");
  6. while(n>12)
  7. scanf("%d",&n); /*控制输入正确的值以保证屏幕显示的图形正确*/
  8. for(i=0;i<=n;i++) /*控制输出N行*/
  9. {
  10. for(j-0;j<24-2*i;j++) printf(" "); /*控制输出第i行前面的空格*/
  11. for(j=1;j<i+2;j++) printf("%4d",c(i,j)); /*输出第i行的第j个值*/
  12. printf("\n");
  13. }
  14. }
  15. void int c(int x,int y) /*求杨辉三角形中第x行第y列的值*/
  16. {
  17. int z;
  18. if((y==1)||(y==x+1)) return 1; /*若为x行的第1或第x+1列,则输出1*/
  19. z=c(x-1,y-1)+c(x-1,y); /*否则,其值为前一行中第y-1列与第y列值之和*/
  20. return z;
  21. }
复制代码
*思考题
自行设计一种实现杨辉三角形的方法
作者: terse    时间: 2012-3-16 21:04

本帖最后由 terse 于 2012-3-16 22:51 编辑

推算
  1. @echo off&setlocal enabledelayedexpansion
  2. set Line=15
  3. for /l %%i in (0 1 %Line%) do set k=   !k!&set /a "var%%i_0=1,var%%i_%%i=1,_%%i=%%i-1"
  4. for /l %%i in (2 1 %Line%) do (
  5.     for /l %%j in (1 1 !_%%i!) do (
  6.         set /a "var%%i_%%j=var!_%%i!_!_%%j!+var!_%%i!_%%j"
  7.     )
  8. )
  9. for /l %%i in (0 1 %line%) do (
  10.         set/a "M=(Line-%%i+1)*3"
  11.     for /l %%j in (0 1 %line%) do IF "!var%%i_%%j!" neq "" set var=!var%%i_%%j!     !var!
  12.     for %%k in (!M!) do echo !k:~-%%k!!var!&set var=
  13. )
  14. )
复制代码
计算
  1. @echo off&setlocal enabledelayedexpansion
  2. set Line=15
  3. for /l %%i in (0 1 %Line%) do set k=   !k!&set /a "_%%i=%%i-1"
  4. for /l %%i in (0 1 %Line%) do (
  5.     set/a "N=1,Var=1,M=(Line-%%i+1)*3"
  6.     for /l %%j in (0 1 !_%%i!) do (
  7.         set /a "N=N*(%%i-%%j)/(%%j+1)"
  8.         set Var=!var!     !N!
  9.     )
  10.     for %%k in (!M!) do echo !k:~-%%k!!var!
  11. )
  12. pause
复制代码
再添加一个
  1. @echo off&setlocal enabledelayedexpansion
  2. set Line=9
  3. for /l %%i in (0 1 %Line%) do set "k=   !k!"&set/a "_%%i=%%i-1"
  4. for /l %%i in (1 1 %Line%) do (
  5.     SET M1=1&set var=&set/a"M=(Line-%%i+1)*3"
  6.     for /l %%j in (1 1 %%i) do  set /a "N%%j=M%%j+M!_%%j!"
  7.     for /l %%j in (1 1 %%i) do set M%%j=!N%%j!&set Var=!var!     !M%%j!
  8.     for %%k in (!M!) do echo !k:~-%%k!!var!
  9. )
  10. PAUSE
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2