解题思路:这个题目花了我好长时间,因为还不会链表。
1,这个题目是要有n个人,所以就是说会出局n-1个人,因此每出局一个人便会计数一次。
2,又由于是转成圈圈,考虑让循环一直循环,并且有一个计数可以随着循环一直累加下去,直至达到终止条件。
3,又由于需要的剩下人的序号,所以考虑一个自然数数组,并且让计数为3的倍数时让那个数变为0,且当再一次扫描那个数时,不作任何处理。
4,欲更加了解,请看代码。
注意事项:
参考代码:
#include<stdio.h>
int main(){
int n,i,m; //n为总的人数,i是为了循环用,m是为了让总循环停止而设置的一个数
int l=0; //l是总的计数
int t=0; //t是为了要记所需要的序号
int *p; //这一部分是给n以及数组赋值
scanf("%d",&n);
int a[n];
m=n;
p=&a[0];
for(i=0;i<n;i++)
*(p+i)=i+1;
while(m){ //循环的终止条件为当所有数组的数都变为0时
for(i=0;i<n;i++){
if(a[i]!=0){ //当那个人还没有出局的时候,就可以报数,其实也可以理解成,当那个人 //报数为3的倍数时,就会出局。
t=a[i]; //存在的人的序号就会被赋值给t,一直到最后一个,最后一个被赋值的即 //为胜利者
l++;
if(l%3==0){ //这是筛选出被淘汰的人的序号,并被赋值为0,以后不会再参加有效的 //循环
a[i]=0;
m--; //每淘汰一人,计数就减一,直至为0
}
}
}
}
printf("%d",t);//输出的为最后一个变为0的那个数组的元素值,即为胜利者。
return 0;
}
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:643 |
C二级辅导-公约公倍 (C语言代码)浏览:1510 |
C语言考试练习题_一元二次方程 (C语言代码)浏览:737 |
回文串 (C语言代码)浏览:2860 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:900 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:512 |
幸运数 (C++代码)浏览:1265 |
字符逆序 (C语言代码)浏览:460 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:477 |
1197求助浏览:631 |