标题: 批处理脚本实现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) 其它
本程序应是根据以上递归的数学表达式编制的。
*程序说明与注释- #include<stdio.h>
- int main()
- {
- 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",c(i,j)); /*输出第i行的第j个值*/
- printf("\n");
- }
- }
-
- void int c(int x,int y) /*求杨辉三角形中第x行第y列的值*/
- {
- int z;
- if((y==1)||(y==x+1)) return 1; /*若为x行的第1或第x+1列,则输出1*/
- z=c(x-1,y-1)+c(x-1,y); /*否则,其值为前一行中第y-1列与第y列值之和*/
- return z;
- }
复制代码
*思考题
自行设计一种实现杨辉三角形的方法
作者: terse 时间: 2012-3-16 21:04
本帖最后由 terse 于 2012-3-16 22:51 编辑
推算- @echo off&setlocal enabledelayedexpansion
- set Line=15
- for /l %%i in (0 1 %Line%) do set k= !k!&set /a "var%%i_0=1,var%%i_%%i=1,_%%i=%%i-1"
- for /l %%i in (2 1 %Line%) do (
- for /l %%j in (1 1 !_%%i!) do (
- set /a "var%%i_%%j=var!_%%i!_!_%%j!+var!_%%i!_%%j"
- )
- )
- for /l %%i in (0 1 %line%) do (
- set/a "M=(Line-%%i+1)*3"
- for /l %%j in (0 1 %line%) do IF "!var%%i_%%j!" neq "" set var=!var%%i_%%j! !var!
- for %%k in (!M!) do echo !k:~-%%k!!var!&set var=
- )
- )
复制代码
计算- @echo off&setlocal enabledelayedexpansion
- set Line=15
- for /l %%i in (0 1 %Line%) do set k= !k!&set /a "_%%i=%%i-1"
- for /l %%i in (0 1 %Line%) do (
- set/a "N=1,Var=1,M=(Line-%%i+1)*3"
- for /l %%j in (0 1 !_%%i!) do (
- set /a "N=N*(%%i-%%j)/(%%j+1)"
- set Var=!var! !N!
- )
- for %%k in (!M!) do echo !k:~-%%k!!var!
- )
- pause
复制代码
再添加一个- @echo off&setlocal enabledelayedexpansion
- set Line=9
- for /l %%i in (0 1 %Line%) do set "k= !k!"&set/a "_%%i=%%i-1"
- for /l %%i in (1 1 %Line%) do (
- SET M1=1&set var=&set/a"M=(Line-%%i+1)*3"
- for /l %%j in (1 1 %%i) do set /a "N%%j=M%%j+M!_%%j!"
- for /l %%j in (1 1 %%i) do set M%%j=!N%%j!&set Var=!var! !M%%j!
- for %%k in (!M!) do echo !k:~-%%k!!var!
- )
- PAUSE
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |