Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2538903
  • 博文数量: 308
  • 博客积分: 5547
  • 博客等级: 大校
  • 技术积分: 3782
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 09:47
个人简介

hello world.

文章分类

全部博文(308)

分类: C/C++

2010-08-17 10:05:25

   有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) |
给主人留下些什么吧!~~