爱编程的小笨孩


私信TA

用户名:2119394720

访问量:20542

签 名:

我在成长,总有一天我会足够优秀。

等  级
排  名 163
经  验 6819
参赛次数 6
文章发表 44
年  龄 0
在职情况 学生
学  校 黄河科技学院
专  业 软件工程

  自我简介:

一只想要当凤凰的鸡

解题思路:

首先定义一个数组arr用来保存每个人的编号,然后再定义指针p指向数组arr,变量n保存的是人的个数,将n的值赋值给m。

所有变量定义好之后使用for循环给每个人编号,代码如下:

for(i=0;i<n;i++)
    {
        *(p+i)=i+1;
    }


然后报数开始,用while循环来实现,报到3的人退出,在代码中令其原来的编号变为0代表其已经退出,直至为最后一个人时退出循环,此部分代码如下:

while(m>1)
    {
        //每个人开始报数
        if(*(p+i)!=0)
        {
            k++;
        }
        //报数为3的进行处理
        if(k==3)
        {
            *(p+i)=0;
            k=0;
            m--;
        }
        //每判断一个人后i++转向下一个人
        i++;
        //当i的值和输入人数相等时将i重新置零从头开始报数
        if(i==n)
        {
            i=0;
        }
    }


当while循环退出时,说明只剩下一个人,也就是说只有一个人的编号没有被置为0,所以为了找出此人,还需要对所有的人进行一次遍历,判断其编号是否为了,如果不是,则此人便是想要的结果,此段代码如下:

for(i=0;i<n;i++)
    {
       if(*(p+i)!=0)
       {
           cout<<*(p+i);
       }
    }


本题完整的参考代码:

#include<iostream>
using namespace std;
int main()
{
    int arr[100];
    int n;
    int *p;
    int i;
    int m;
    int k=0;
    //让指针指向数组arr
    p=arr;
    cin>>n;
    m=n;
    //给每个人编号
    for(i=0;i<n;i++)
    {
        *(p+i)=i+1;
    }
    i=0;
    //在while循环中找出最后留下的那个人
    while(m>1)
    {
        //每个人开始报数
        if(*(p+i)!=0)
        {
            k++;
        }
        //报数为3的进行处理
        if(k==3)
        {
            *(p+i)=0;
            k=0;
            m--;
        }
        //每判断一个人后i++转向下一个人
        i++;
        //当i的值和输入人数相等时将i重新置零从头开始报数
        if(i==n)
        {
            i=0;
        }
    }
    //用for循环找到那个人并输出
    for(i=0;i<n;i++)
    {
       if(*(p+i)!=0)
       {
           cout<<*(p+i);
       }
    }
    return 0;
}


 

0.0分

26 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

#include<stdio.h>
int main()
{
	int n;
	scanf("%d", &n);//人数
	int a[n];
	int i, j;
	for(i=0; i<n; i++)//初始化为一证明还在队列 
		a[i] = 1;
	int m = n;
	j=0;
	while(m != 1)
	{
		for(i=0; i<3; j++)//i是为了要找到第三人,j是为了循环 
		{
			j%=n;
			if(a[j] == 1){//只有元素为一的时候才加人 
				i++;
			}	
		}
		m--;//总人数减一 
		j--;
		a[j] = 0;//对应位置的人去掉 
	}
	for(i=0; i<n; i++)
		if(a[i] == 1)
			printf("%d", i+1);
	return 0;
}
2023-03-21 18:50:04
我靠 我改成和楼主差不多了 结果还是时间超限 为什么呀
#include<iostream>

using namespace std;

int main() {
	int arr[100],n,m,k,i=0;
	cin>>n;
	m=n;
	int* p;
	p=arr;
	for(i=0; i<n; i++) {
		*(p+i)=i+1;
	}
	i=0;
	while(n>1) {
		if(*(p+i)!=0) {
			k++;
		}
		if(k==3) {
			*(p+i)=0;
			k=0;
			n--;
		}
		i++;
		if(i==m) {
			i=0;
		}
	}
	for(i=0; i<m; i++) {
		if(*(p+i)!=0) {
			cout<<*(p+i);
		}
	}
	return 0;
}
2023-01-14 15:51:02
为什么我会时间超限呀
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;

int main() {
	int arr[100],n,m,k,i=0;
	scanf("%d",&n);
	m=n;
	for(i=0; i<n; i++) *(arr+i)=i+1;
	i=0;
	while(n>1) {
		if(*(arr+i)!=0) {
			k++;
		}
		if(k==3) {
			*(arr+i)=0;
			k=0;
			n--;
		}
		i++;
		if(i==m) {
			i=0;
		}
	}
	for(i=0; i<m; i++) {
		if(*(arr+i)!=0) {
			cout<<*(arr+i);
		}
	}
	return 0;
}
2023-01-14 15:42:38
思路清晰!点赞!另外请问这里的指针p是否是为了便于程序的理解呢,因为也可以直接用arr[]本尊出来进行操作。
2022-07-29 14:25:53
  • «
  • 1
  • »