有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
我的编程思路是这样的:设置一个指针,对数组进行顺序读取,如果计数的为3,则将指针所指的数设置为0,当指针到最后一个元素,则指针需要返回到最后一个,如果指针所指的数为0,则进行下一个数组单元的读取。同时设计一个置零的统计器,当置零的元素+1等于数组的总长度时(即为最后一个元素时),退出循环。代码如下:
#include <stdio.h> #define N 60000
void oper(int *,int,int); int main(int argc, char *argv[]) { int arr[N],i,n; int *p; printf("the all persion is count:"); scanf("%d",&n); for (p = arr,i = 0; i < n; i++) { *p++ = i + 1; } p = arr; oper(p,n,3); system("pause"); return 0; }
void oper(int *arr,int n,int num) { int *p,*p_begin,*p_end; int count = 0,k = 0; p_begin = arr; p_end = arr + n; p = p_begin; do { if (*p != 0 ) { k ++; } if (k == num) { if (count + 1 == n) //when the remove element is last one ,break circle.
{ break; } else { printf("remove number : %d \n",*p); // printf remove info.
*p = 0; //set point element is 0.
k = 0; //counter reset 0.
count ++; } } p++; if (p == p_end) { p = p_begin; } }while(1); printf("\nthe result number : %d\n",*p); }
|
阅读(974) | 评论(0) | 转发(0) |