Chinaunix首页 | 论坛 | 博客
  • 博客访问: 124592
  • 博文数量: 52
  • 博客积分: 2200
  • 博客等级: 大尉
  • 技术积分: 580
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-08 15:00
文章分类

全部博文(52)

文章存档

2011年(1)

2009年(51)

我的朋友

分类: C/C++

2009-10-14 22:44:16

 


/*=============================================================
              目的:有n个人围成一圈,顺序排号。从第一个人开始报数
              (从1到3报数),凡报到3的人退出圈子,问最后剩下的是原来的几号
               
             算法分析:1、 定义整形指针,输入人员总数和退出的幸运数字。
                       2、定义数组游标i,报号游标j,总退出人数计数器k
                       3、 从数组第一元素开始遍历,如果报号游标j=m,那么该元素为0,并且计数器k增加一个,直到剩余一个元素为止。
                       4、输出剩余元素的原来的序号。
==============================================================
              作者:最后的村长
              时间:2009年10月12日
              工具:DEV C++ 4.9.9.2
              version:1.0
==============================================================*/

#include <stdio.h>
#include <stdlib.h>

/*=============================================================*/

/********************不幸运数u可以根据需要改变,人数不限制********************

程序如下:(说明,报数数为3退出,那么不幸运数是 u=3.) */


int luck_number(int n,int u)
{
 /*该函数返回最后留下来的人的编号*/
 /*其中, n是总人数,u是不幸运数(报数到该数退出)*/
 int *pep,i,j,k;
 pep=(int *)malloc(n*sizeof(int));
 for(i=0;i<n;i++) pep[i]=i+1; //初始化赋值

 for(i=0,j=0,k=1;k<n;i++)
 {
  i=i%n; //保证i从1开始遍历,聪明!

  if(pep[i]!=0)
  {
   j++;/*j是报数游标,*/
   if(j%u==0) {printf("第%d个退出的是:%d\n",k,pep[i]);pep[i]=0;k++;}/*如果j=u,退出的人号码改为0,并k用来记录退出的人总数*/
  }
 }
 for(i=0;i<n;i++)
 if(pep[i]!=0) break;
 return pep[i];
}


int main()
{
 int n,u;
 printf("请输入人员总数: n= ");
 scanf("%d",&n);
 printf("请输入退出人员的号码: u= ");
 scanf("%d",&u);
 printf("幸运号是 : %d",luck_number(n,u));/*u是报数的时要退出的数*/
 
 system("pause");
 return 0;
}


阅读(3162) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~