解题思路:
首先定义一个数组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 人评分
#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; }
思路清晰!点赞!另外请问这里的指针p是否是为了便于程序的理解呢,因为也可以直接用arr[]本尊出来进行操作。
C语言程序设计教程(第三版)课后习题12.5 (C语言代码)浏览:875 |
2^k进制数 (C++代码)使用递归方法浏览:736 |
【回文数(二)】 (C语言代码)浏览:940 |
【偶数求和】 (C++代码)浏览:786 |
奖学金 (C++代码)浏览:2053 |
C语言训练-排序问题<2> (C++代码)浏览:935 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:687 |
WU-拆分位数 (C++代码)浏览:819 |
DNA (C语言描述,数据结构)浏览:909 |
WU-C语言程序设计教程(第三版)课后习题11.11 (C++代码)(想学链表的可以看看)浏览:1464 |