ROG


私信TA

用户名:dotcpp0688243

访问量:5492

签 名:

等  级
排  名 2435
经  验 2309
参赛次数 0
文章发表 8
年  龄 0
在职情况 学生
学  校 广东技术师范大学
专  业 数字媒体技术

  自我简介:

解题思路:

将数组的元素值赋值为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 人评分

  评论区

  • «
  • »