C语言n个人围成一圈程序设计
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{count++; if(count==size) count=0;}//这个循环是用来数k个人,count就是第k个人在数组中 的位置,数到最后一人,从头开始数 size--;//参与者数目减1
printf("第 %d 个淘汰者是 %d 号\n",n-size,a[count]);
for( i=count;i<=size;i++) a[i]=a[i+1];//从数组中删除淘汰者 count--;//因为删除了淘汰者,而下次是从淘汰这的下一个开始
而 size表示的是剩余参与者的数目,按k循环往后数,数到第size个人 之后从头开始,count记录的是当前数到的人在数组中的位置,因为初 始没有数, 所以初值为-1(数组下标从0开始)*/ a=new int[n]; for(int i=0; i<n; i++)
{a[i]=i+1;}//这里可以用输入语句scanf("%d",&a[i]);来手动输入 每个参与者的编号 while(size>1) { //进行淘汰直到剩余参与者只有一人 for(int i=0;i<k;i++)
2、 题目分析:
把1到n个人的编号存到数组a[]中,用count代表当前数到的人在数 组中的位置,用size代表剩余的人数,从1数到k,且每次把 count(count初值设置为-1)加上1,(如果没数到k之前count等于 size,为了满足题目要求,顺时针继续淘汰,则令count等于0,继续往 下淘汰),因为每次循环都淘汰了一个人,所以每次都size减去1,输 出第n-size个淘汰者及号码a[count],淘汰者出局后,就不可能再有被 数的机会,所以要在数组a[]中把淘汰者删除,删除后,原来后面的编 号相应的前移一位,因为删除了淘汰者,而下次是从淘汰这的下一个开 始数,也就是说从删除后的淘汰者的前一个的下一个开始,所以, count减一,如此循环直到size等于1为止,并输出幸存者a[0]。
这个程序的关键是实现一圈循环之后怎样继续向下一圈循环,为此 想到了count等于size,即:当前数到的人在数组中的位置=剩余的人 数。这是程序设计的关键。
3、 流程图(见下页):
开始 输入count,sizFra bibliotek,i,k,n数组a[count]
Count=-1 Size=n Count=0
Size>1? Count=size
数,也就是说从删除后的淘汰者的前一个的下一个开始,所以,count 减一*/
} printf("幸存者是 %d 号\n",a[0]); }
5、 C程序运行结果:
i=0 Count=count+1
i=i+1 i<k? size=size-1 Count=count-1
输出a[count],a[0] 结束
说明:1.size表示的是剩余参与者的数目。 2.count记录的是当前数到的人在数组中的位置。 3.count等于size 即:数到最后一人,从头开始数。
4、 C程序代码演示:
#include<stdio.h> void main() {void fun(int n, int k); int total, num; printf("请输入总人数:\n"); scanf("%d",&total); printf("请输入淘汰号k:\n"); scanf("%d",&num); fun(total,num); } void fun(int n, int k) { int *a, size=n, count=-1; //*数组a存储的是n个参与者的编号,
高级语言程序设计(C) 课程设计报告
系 (部): 专 业: 班级 学生姓名 : 学 号: 指导教师: 成 绩: 日 期 :2012.06.25——2012.06.30
1、 C语言程序题目:
有n个人围成一圈,(假设他们的编号沿顺时针方向依次为1到n), 编程序,使用数组来存放数据(人员编号),而后从1号人员开始数起 (沿顺时针方向),当数到k时(k〉1由用户输入),该号人员被“淘 汰出局”;接着仍沿着顺时针方向从淘汰者的下一人员重新从1开始数 起,数到k后,淘汰第二个人;如此继续,直到最后剩下一人为止。请 输出现后被“淘汰”的人的编号。
printf("第 %d 个淘汰者是 %d 号\n",n-size,a[count]);
for( i=count;i<=size;i++) a[i]=a[i+1];//从数组中删除淘汰者 count--;//因为删除了淘汰者,而下次是从淘汰这的下一个开始
而 size表示的是剩余参与者的数目,按k循环往后数,数到第size个人 之后从头开始,count记录的是当前数到的人在数组中的位置,因为初 始没有数, 所以初值为-1(数组下标从0开始)*/ a=new int[n]; for(int i=0; i<n; i++)
{a[i]=i+1;}//这里可以用输入语句scanf("%d",&a[i]);来手动输入 每个参与者的编号 while(size>1) { //进行淘汰直到剩余参与者只有一人 for(int i=0;i<k;i++)
2、 题目分析:
把1到n个人的编号存到数组a[]中,用count代表当前数到的人在数 组中的位置,用size代表剩余的人数,从1数到k,且每次把 count(count初值设置为-1)加上1,(如果没数到k之前count等于 size,为了满足题目要求,顺时针继续淘汰,则令count等于0,继续往 下淘汰),因为每次循环都淘汰了一个人,所以每次都size减去1,输 出第n-size个淘汰者及号码a[count],淘汰者出局后,就不可能再有被 数的机会,所以要在数组a[]中把淘汰者删除,删除后,原来后面的编 号相应的前移一位,因为删除了淘汰者,而下次是从淘汰这的下一个开 始数,也就是说从删除后的淘汰者的前一个的下一个开始,所以, count减一,如此循环直到size等于1为止,并输出幸存者a[0]。
这个程序的关键是实现一圈循环之后怎样继续向下一圈循环,为此 想到了count等于size,即:当前数到的人在数组中的位置=剩余的人 数。这是程序设计的关键。
3、 流程图(见下页):
开始 输入count,sizFra bibliotek,i,k,n数组a[count]
Count=-1 Size=n Count=0
Size>1? Count=size
数,也就是说从删除后的淘汰者的前一个的下一个开始,所以,count 减一*/
} printf("幸存者是 %d 号\n",a[0]); }
5、 C程序运行结果:
i=0 Count=count+1
i=i+1 i<k? size=size-1 Count=count-1
输出a[count],a[0] 结束
说明:1.size表示的是剩余参与者的数目。 2.count记录的是当前数到的人在数组中的位置。 3.count等于size 即:数到最后一人,从头开始数。
4、 C程序代码演示:
#include<stdio.h> void main() {void fun(int n, int k); int total, num; printf("请输入总人数:\n"); scanf("%d",&total); printf("请输入淘汰号k:\n"); scanf("%d",&num); fun(total,num); } void fun(int n, int k) { int *a, size=n, count=-1; //*数组a存储的是n个参与者的编号,
高级语言程序设计(C) 课程设计报告
系 (部): 专 业: 班级 学生姓名 : 学 号: 指导教师: 成 绩: 日 期 :2012.06.25——2012.06.30
1、 C语言程序题目:
有n个人围成一圈,(假设他们的编号沿顺时针方向依次为1到n), 编程序,使用数组来存放数据(人员编号),而后从1号人员开始数起 (沿顺时针方向),当数到k时(k〉1由用户输入),该号人员被“淘 汰出局”;接着仍沿着顺时针方向从淘汰者的下一人员重新从1开始数 起,数到k后,淘汰第二个人;如此继续,直到最后剩下一人为止。请 输出现后被“淘汰”的人的编号。