原题链接:[编程入门]报数问题
解题思路:
首先定义一个数组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分
15 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#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; }我靠 我改成和楼主差不多了 结果还是时间超限 为什么呀 #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; }为什么我会时间超限呀 #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; }