解题思路:
将数组的元素值赋值为0(即没有被淘汰),被淘汰赋值为1.
然后while循环一直循环,打印输出了数据。
while里面再来个for循环,一直遍历整个数组
通过创建三个变量来记录和修改淘汰的数组元素
通过if判断来记录并修改
int num, count,num1;//变量1:记录被淘汰数。变量2:记录每个没被淘汰的人的报数。变量3:记录被淘汰的人的在数组中的位置
注意事项:
输出的时候对元素有要求,如下
if(num==(n-1)&&arr[i]!=1)//最后淘汰人数达标,并且此时被遍历的这个数组元素(可能是被淘汰的,也可能是没被淘汰的)没被淘汰,即值不为1,就输出
记录要被淘汰的元素也有要求,如下:
if (count == 3)//报数达标,记录这个元素的数组下标!!!!(因为下一次循环就不是报数为三的元素了,可能是被淘汰的,也可能是没被淘汰的) { num1 = i; }
一直用if才会每一次for循环都对每一个if语句进行判断,else if不一定会
参考代码:
#include<stdio.h> void test42(int n) { //报数问题 //有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数), //凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。 int*arr=(int*)malloc(sizeof(int) * n); memset(arr, 0,n); int num, count,num1;//变量1:记录被淘汰数。变量2:记录每个没被淘汰的人的报数。变量3:记录被淘汰的人的在数组中的位置 num = num1=count=0; int isNoPrint = 1;//是否打印了编号(若不设置,输入的数为三的整数倍时不会输出数据) while(num!=n-1||isNoPrint)//循环查找(满足条件之一:1、被淘汰的人数不够;2、没有输出数据) { for(int i=0;i<n;i++)//一直遍历数组每个元素 { if(count==3 && num != (n - 1))//若报数达到三,则 { count = 0;//将报数置为0 arr[num1] = 1;//更改报数为3的数组元素(先前有记录其下标,num1) num++;//淘汰的人+1 } if(count!=3&&arr[i]!=1&&num!=(n-1))//若报数不为3,此时的这个数组的元素也没被淘汰,淘汰人数也不达标。 { count++;//就可以报数 } if (count == 3)//报数达标,记录这个元素的数组下标!!!!(因为下一次循环就不是报数为三的元素了,可能是被淘汰的,也可能是没被淘汰的) { num1 = i; } if(num==(n-1)&&arr[i]!=1)//最后淘汰人数达标,并且此时遍历的这个数组元素(可能是被淘汰的,也可能是没被淘汰的)没被淘汰,即值不为1,就输出 { printf("%d", i+1);//编号为数组下标加一 isNoPrint = 0;//打印了,值为假 return; } } } if (arr!=NULL) { free(arr); arr=NULL; } } int main() { int n = 0; scanf("%d", &n); test42(n); return 0; }
0.0分
2 人评分
数列 (C++代码)浏览:707 |
P1002 (C语言代码)浏览:1019 |
兰顿蚂蚁 (C++代码)浏览:1225 |
C语言训练-排序问题<1> (C语言代码)浏览:636 |
简单的a+b (C语言代码)浏览:385 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1015 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:548 |
三角形 (C++代码)记忆化搜索浏览:1317 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:388 |
1013题解浏览:596 |