c语言看不懂问题 如图中的代码,该题是求杨辉三角的题目。但是这个求法看不懂。。求解释,谢谢~

C语言完整队列&与链式队列实现杨辉三角
////////////////////贵州商专///////////////////
////////////////编译环境VS2010////////////////
#include "stdafx.h"
#include "stdlib.h"
#define M 100
typedef struct node
struct node *
struct node *
struct node *
& & &//队列结构
void chushihua(list *l) & &
l-&wei=(list *)malloc(sizeof(list));
if(l-&wei==NULL) exit(0);
l-&tou=l-&
int pankong(list *l) & &
& & //判空
if(l-&tou-&next==NULL)
printf("队列为空!请插入元素!\n");
void rudui(list *l,int w) & &
list *p=(list *)malloc(sizeof(list));
if(p==NULL) exit(0);
p-&next=NULL;
l-&wei-&next=p;
void duitou(list *l) & &
& & //取队头元素
if(pankong(l))&
printf("出队元素为:%d\n",l-&tou-&next-&S_J);
l-&tou-&next=l-&tou-&next-&
if(l-&tou-&next==NULL)
& &//当队列为空的时候,从新初始化,否则不能插入元素
l-&wei=l-&
void chadui(list *l) & &
& & & //查看队列
list *p=l-&tou-&
& &//定义临时变量,防止破坏原队列
printf("%d-&",p-&S_J);
printf("END\n");
void yanhui(int w)
int a[M][M],i,j;
for(i=0;i&M;i++)
&for(j=M;j&=i;j--)
&printf(" &");
&for(j=0;j&=i;j++)
&if(i==j||j==0)
&a[i][j]=1;
&a[i][j]=a[i-1][j]+a[i-1][j-1];
&printf("= ",a[i][j]);
&printf("\n");
///*上面采用的是数组的方法输出杨辉三角!较为简单,所以就不注释了!下面将采用队列的方法来实现杨辉三角!
// 相比前一种方法更节省内存空间,但同时也复杂很多!(没办法!老师要求用队列啊!)
//链表队列:
int y=1;int n=0,t=0; &
& //都是控制流程的变量,没有必要纠结于此!
list *p=(list *)malloc(sizeof(list)); &
list *l=(list *)malloc(sizeof(list)); &
list *f=(list *)malloc(sizeof(list)); &
& //p、l为中间链表;f是我们所要的链表!
chushihua(p);
chushihua(l);
chushihua(f); & &
& & & //初始化
list *s=p;
for(i=1;i&=w;i++)
for(j=1;j&=i;j++) &
& & //与数组形式差不多!
& if(j==1||i==j) &
& rudui(p,1); &
&//每行的头、尾都为1,入对列
& else & &
&//不是行头尾时
& if(y==2) &
& &//本行之内出对,使队头后移一位
rudui(l,s-&tou-&next-&S_J);
s-&tou-&next=s-&tou-&next-&
& if(y==1) &
& &//从上一行出对,使得队头移到到本行
for(k=1;k&=(i-2)*(i-2+1)/2-n;k++)
& //(i(i-2)*(i-2+1)/2-n 表示所需出对的次数,
rudui(l,s-&tou-&next-&S_J);
&//使得队头移动到本行开头!
s-&tou-&next=s-&tou-&next-&
& y=2;n=n+t;
rudui(p,s-&tou-&next-&S_J+s-&tou-&next-&next-&S_J);
&//以上为核心算法,看上去有点复杂,但如果告诉你算法的思想,你大概就能明白了!
首先:杨辉三角的特点是第N行的中间值等于N-1行两值的和(有点不标准,但你应该明白意思~~)
& 所以,我们要解决的是如何使队头定位到第N-1
& 明白了思路,我们就来实现:
& 首先,用链表p(s也一样)保存当前入队的值
然后,定位到N-1行,因为队列采用的是单进单出,所以我们只能依次取队头元素让队头指向到N-1
& 为止,并把取出的队头元素入l这个临时的队列
最后,由于队头已经移到了N-1行,所以在第N行的中间值就可以通过N-1两数和入队了!
由于p为当前队列,而l出对元素组成的队列,所以只要把l与p连接起来,就可以获取杨辉三角的链表了!
PS:最好对着杨辉三角图形来看更容易理解,本程序的就是根据这个思路来完成的!由于程序中调用其他
的函数,不便与修改!故程序实现的代码很是杂乱(当然,也有技术问题~~),但这不要紧,最主要是
& 明白了思路,然后你可以通过你自己的方法来实现!!//
while(l-&tou-&next)&
rudui(f,l-&tou-&next-&S_J);
l-&tou-&next=l-&tou-&next-&
while(p-&tou-&next)&
rudui(f,p-&tou-&next-&S_J);
p-&tou-&next=p-&tou-&next-&
& &//以上用f接受l与p的元素,至此杨辉三角队列完成!
printf("线性输出为:\n");
chadui(f);
printf("金字塔输出效果:\n");
for(i=0;i&w;i++)
for(j=w;j&=i;j--)
printf(" &");
for(j=0;j&=i;j++)
",f-&tou-&next-&S_J);
f-&tou-&next=f-&tou-&next-&
printf("\n");
int _tmain(int argc, _TCHAR* argv[])
chushihua(&p);
printf("请输入队列长度:");
scanf("%d",&max);
for(i=1;i&=i++)
printf("请输入第%d数据:",i);
scanf("%d",&cd);
rudui(&p,cd);
& & while(1)
printf("\t请选择以下操作:\n");
printf("\t1、查看队列!\n");
printf("\t2、入对!\n");
printf("\t3、出对!\n");
printf("\t4、杨辉三角!\n");
printf("\t5、退出 !\n");
fflush(stdin);
scanf("%d",&XZ);
switch(XZ)
chadui(&p);
printf("请输入进队元素:");
scanf("%d",&sr);
rudui(&p,sr);
printf("进对成功!\n");
duitou(&p);
printf("提示:程序会采用金字塔输出!为了保证输出效果,行数建议不要大于15!\n");
printf("请输入行数:");
scanf("%d",&yh);
yanhui(yh);
printf("请确认输出!\n");
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。类似杨辉三角的题目.如图所示,他满足①第n行首尾两数均为n,②表中的递推关系类似杨辉三角,则第n行的第2个数是?
_百度作业帮
类似杨辉三角的题目.如图所示,他满足①第n行首尾两数均为n,②表中的递推关系类似杨辉三角,则第n行的第2个数是?
我需要一个公式哪位能帮上的提前说声谢谢了~急用~!
n(n-1)/2+1...如果没计算错应该就是这个了.
n+(n-1)*(n-2)/2
设每排第二个数为an
第一排1看也看作第二个数an-a(n-1)=n-1罗列a(n-1)-a(n-2)=n-2..a2-a1=1所有相加an=n(n-1)/2 +1
2+2+3+4+……+N-1=1+N(N-1)/2
您可能关注的推广回答者:回答者: 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
C语言求杨辉三角的6种方法
下载积分:800
内容提示:
文档格式:DOC|
浏览次数:0|
上传日期: 06:17:41|
文档星级:
该用户还上传了这些文档
C语言求杨辉三角的6种方法.DOC
官方公共微信杨辉三角中的奇偶问题求第n行中奇数的个数,这个n可能会很大,例如65535,_百度作业帮
杨辉三角中的奇偶问题求第n行中奇数的个数,这个n可能会很大,例如65535,
有三个思路:1 把奇数写成1,偶数写成0,当成二进制好了.然后按照每行的递推关系1+1=0,0+0=0这样来做.数数.这个方法最笨,如果是平时考试的话可能就这样做2 杨辉三角有个定理:第2^k -1 行全是奇数,第2^k行除了两端的1之外全是偶数.而第n行有n个数字.如果碰巧题目问到了2^k-1或是2^k的行数,你就直接按照这个定理计算3 你给了65535的范围.我感觉你好象是参加信息学竞赛的吧?这个题目本身通项公式就很难写出.如果是编程的话,最好的就是开一个65536的boolean数组,肯定不会超界.每次用递推关系来计算,仍然是true+true=false,true+false=true,false+false=false.只保留一个一维数组.应该能在5秒的时限内跑出来.
行(即这行有多少个数) 个(奇数) 个(偶数) 1----------1-----------1----------02--------1---1---------2----------0 3-------1--2--1--------2----------14------1--3--3-1-------4----------05-----1-4-...
您可能关注的推广回答者:回答者:

我要回帖

更多关于 c语言题目 的文章

 

随机推荐