求杨辉三角
给出任意值
输出一个杨辉三角!!!
------解决方案--------------------不会,帮顶
------解决方案----------------------C语言的
在屏幕上显示杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 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个值与第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;
}
------解决方案--------------------给出的任意值 !!
需用sql写
------解决方案--------------------CREATE proc pr_YangHui
@c int
as
/* SQL实现显示杨辉三角 */
/* 版本: 1.0 */
/* 作者: Haiwer */
/* 版权所有 */
/* 2006.05.10 */
set nocount on
if @c <2 return --两层以下就不排了
declare @i int
declare @j int
declare @sql varchar(8000)
declare @sql1 varchar(8000)
declare @sql2 varchar(8000)
create table #(id int IDENTITY(1,1),a50000 bigint)
insert #(a50000) values (1) --第一层
set @i=2
while @i <=@c
begin
--为了实现动态层,只好动态修改临时表结构
set @sql= 'alter table # add a '+cast(50000+@i-1 as varchar(10))+ ' bigint,a '+cast(50000-@i+1 as varchar(10))+ ' bigint '
exec (@sql)
set @sql1= ' '
set @sql2= ' '
set @j=@i-1
while @j> =0
begin
--这里判断有点乱
if @j=0
set @sql1=@sql1+ ',a '+cast(50000-@j as varchar(10))
else
set @sql1=@sql1+ ',a '+cast(50000-@j as varchar(10))+ ',a '+cast(50000+@j as varchar(10))
if @j=@i-1
set @sql2=@sql2+ ',1,1 '
else
if @j=0
set @sql2=@sql2+ ',a '+cast(50000-@j-1 as varchar(10))+ '+a '+cast(50000-@j+1 as varchar(10))
else
set @sql2=@sql2+ ',a '+cast(50000-@j-1 as varchar(10))+ '+a '+cast(50000-@j+1 as varchar(10))+ ',a '+cast(50000+@j-1 as varchar(10))+ '+a '+cast(50000+@j+1 as varchar(10))
set @j=@j-2
end
--去掉多余的逗号
set @sql1=right(@sql1,len(@sql1)-1)
set @sql2=right(@sql2,len(@sql2)-1)
set @sql=cast(@i-1 as varchar(10))
exec( 'insert #( '+@sql1+ ') select '+@sql2+ ' from # where id= '+@sql)
set @i=@i+1
end
set @i=50000-@c+1
set @j=50000+@c-1
set @sql= ' '
--去最长的数据,就是为了节省显示空间
select @sql1=CAST(len(cast(max(a50000) as varchar(50)))+1 AS VARCHAR(10)) from #
while @i <=@j
begin
set @sql=@sql+ ',isnull(cast(a '+cast(@i as varchar(10))+ ' as varchar( '+@sql1+ ')), ' ' ' ') '