帮忙解释解释,不知道咋回事,帮我一步步解释解释。
例:有N个人围成一圈,顺序排号,从第一个人开始报数(从一到三报数),凡报到三的人退出圈子,问最后留下的是原来第几号的那位?
main()
{int i,k,m,n,num[50],*p;
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1;
i=0;k=0;m=0;
while(m<n-1)
{if(*(p+i)!=0) k++;
if(k==3)
{*(p+i)=0;
k=0;
m++;}
i++;
if(i==n) i=0;
}
while(*p==0) p++;
printf("%d\n",*p);
}
[解决办法]
- C/C++ code
main(){int i,k,m,n,num[50],*p; scanf("%d",&n);//N个人 p=num; for(i=0;i<n;i++)*(p+i)=i+1; i=0;k=0;m=0; while(m<n-1)//当找到第n-1个人时,循环停止,剩下一个就是最后出圈的{ if(*(p+i)!=0) k++;//k表示计数if(k==3)//数到3,找到一个人{*(p+i)=0;//把这个人所在的位置置零作为已经出圈的标记k=0;//k从0开始计数m++; }//m表示已经找到的人数i++;if(i==n) i=0;//如果i到达数组的尾部,则从头开始} while(*p==0) p++;//找到数组中值不为0,即没有出圈的那个人 printf("%d\n",*p);//输出}
[解决办法]
自己写的用循环单链表实现,供参考!
- C/C++ code
#include <stdio.h>#include <malloc.h>typedef struct Node{ int no; struct Node *next;}Node,*pNode;int main(){ int counter, num; printf("围圈的人数:"); scanf("%d", &counter); printf("要数到的数目(>2):"); scanf("%d", &num); //围圈 int i; pNode head = NULL, q = head, p; for (i = 0; i < counter; i++) { p = (pNode)malloc(sizeof(Node)); p->no = i+1; if (i == 0) { head = p; p->next = head; } else { p->next = q->next; q->next = p; } q = p; } //报数处理,注意p,q,counter用来存新的数据喽 q = head; counter = 1; while(1) { if (counter == num) {//这里的删除方式,是把一个结点值赋给本节点,然后删除后面的结点,这样省去对前一个结点指针的记录 p = q->next; if (p == q)//只剩一个结点 { printf("最后一个%d\n", p->no); break; } else { //printf("%d\n",q->no); q->no = q->next->no; q->next = q->next->next; free(p); } counter = 1; } counter++; q = q->next; } free(p); return 0;}