填空题阅读以下说明和C程序,填充函数中的空缺。[说明]N个游戏者围成一圈,从1~N顺序编号,游戏方式如下;从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,直到剩余一个游戏者为止,该游戏者即为获胜者。下面的函数playing(Linklisthead)模拟上述游戏过程并返回获胜者的编号。其中,N个人围成的圈用一个包含N个结点的单循环链表来表示,如图1所示,游戏者的编号放在结点的数据域中。在函数中,以删除结点来模拟游戏者退出圈子的处理。整型变量c(初值为1)用于计数,指针变量p的初始值为head(如图1所示)。游戏时,从p所指向的结点开始计数,p沿链表中的指针方向遍历结点,c的值随p的移动相应地递增。当c计数到2时,就删除p所指结点的下一个结点(因下一个结点就表示报数到3的游戏者),如图2所示,然后将c设置为0后继续游戏过程。结点类型定义如下:typedefstructnodeintcode;/*游戏者的编号*/structnode*next;NODE,*LinkList;[C函数]intP1aying(LinkListhead,intn)/*head指向含有n个结点的循环单链表的第一个结点(即编号为1的游戏者)*/LinkListp=head,q;intthewinner,c=1;while(n>______)if(c==2)/*当c等于2时,p所指向结点的后继即为将被删除的结点*/q=p->next;p->next=______;printf("%d/t",q->code);/*输出退出圈子的游戏者编号*/free(q);/*if*/p=______;/*while*/theWinner=______;free(p);returntheWinner;/*返回最后一个游戏者(即获胜者)的编号*/
填空题[说明]
本程序求3~100之间的所有素数(质数)并统计个数;同时将这些素数从小到大依次写入顺序文件E: /dataout.txt;素数的个数显示在窗体Form1上。
[Visual Basic 代码]
Private Sub Command1_ Click ( )
Dim count as integer, flag as Boolean
Dim t1 as Integer, t2 as Integer
________
Count=0
For t1=3 to 100
Flag=Tree
For t2=2 to Int( Sqr ( t1 ) )
If
________
Then flag=False
Next t2
________
count=
________
write #1, t1
End if
Next t1
________
Close #1
End Sub
填空题[说明] 本程序的函数sum(int,i int total,int sigma,int rear,int d[],int n)用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。 函数sum使用递归方法找出全部解答。参数i表示递归函数当前考虑元素d[i],参数sigma是调用前已选取的部分序列的元素和,参数rear是后面还未考虑的那部分元素的元素和。 函数对元素d[i]有两种可能的选择方案: (1)考虑元素d[i]被包含在新的部分元素序列中的可能性。如果在当前部分元素序列之后接上d[i],新序列的元素和不超过total,则函数将d[i]包含在当前部分元素序列中。如果新的部分元素序列的元素和等于total时,新的部分元素序列就是一个解答,函数将其输出;否则,若继续考虑后面的元素还有可能找到解答时,函数就递归去考虑后面的元素,寻找解答。最后,函数应恢复原来部分元素序列中不包含d[i]的状态。 (2)考虑元素d[i]不被包含在新的部分元素序列中的可能性。如果继续向d[i]之后考虑还是有希望能得到和为total的部分元素序列,函数将新序列不包含d[i也作为一种可能的选择,并递归去考虑后面的元素,寻找解答。 [程序1—7] #include<stdio.h> #define N 100 int a[N]; int fig[N]; sum(int i,im total,int sigma,int rear,int d[],int t) int j; /*考虑元素d[i]被包含在新的部分元素序列中的可能性*/ if(sigma+d[i]<=total) /*如果d[i]与当前序列的和不超过total*/ flg[i]=1; /*d[i]被考虑在当前部分元素序列中*/ if( (1) ==total) /*输出解*/ for(j=0;flg[j]==0;j++); printf("%4d=%d",total,d[j]); for(j++;j<=i;j++) if(flg[j]) printf("+%d",d[j]); printf("\n"); else /*继续考虑后面的元素有可能找到解答时*/ if(i<n-1&&rear+sigma>=total) sum(i+1,total, (2) ,rear-d[i],d,n); (3) ; /*考虑元素d[i]不被包含在新的部分元素序列中的可能性*/ if(i<n-1&&rear-d[i]+tigma>=total) sum(i+1,total, (4) ,rear-d[i],d,n); main() int ij,n,total,s,d; printf("输入total!/n");scanf("%d",&total); printf("输入n!/n");scanf("%d",&n); for(s=i=0;i<n;= printf("输入第%d个元素>0且<=%d)\n",i+1,total; scanf("%d",&d); if(d<1 || d>total) printf("出错,请重新输入!\n"); continue; S+=a[i++]=d; sum(0,total,0, (5) ,a,n); printf("\n\n");