解题思路:这个题目花了我好长时间,因为还不会链表。
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语言程序设计教程(第三版)课后习题8.9 (Java代码)浏览:1413 |
简单的a+b (C++语言代码)浏览:895 |
C语言程序设计教程(第三版)课后习题5.7 (Java代码)浏览:910 |
输入输出格式练习 (C语言代码)浏览:883 |
A+B for Input-Output Practice (III) (C语言代码)浏览:455 |
C语言训练-排序问题<1> (C语言代码)浏览:369 |
C二级辅导-等差数列 (C语言代码)浏览:831 |
三进制小数 (C语言代码)浏览:903 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:581 |
简单的a+b (C语言代码)浏览:676 |