Chinaunix首页 | 论坛 | 博客
  • 博客访问: 393125
  • 博文数量: 87
  • 博客积分: 1171
  • 博客等级: 少尉
  • 技术积分: 1068
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-19 14:34
文章分类

全部博文(87)

文章存档

2014年(10)

2013年(24)

2012年(53)

我的朋友

分类: C/C++

2013-04-10 11:36:23

  
    问题描述:N个人从1到N编号,围成一圈,从1号开始传土豆,经过M次的人离席,又后面的人继续传递,最后的人获胜。



#include
#include
void main()
{
int *a;
int i,j,k;
int M,N;


printf("please input the M   and  N \n");
scanf("%d,%d",&M,&N);


printf("M= %d ,N = %d \n",M,N);


/* if(M ==0)      //简单优化,如果是依次离席,则最后一个胜出
{
printf("%d \n",N);
return ;
}*/


a = (int*)malloc((N)*sizeof(int));      //虽然题目是从1编号,但是如果在在数组中利用1到N 编号,处理回绕的时候需要判断,不如利用0 到N-1 省事,直接求余就可以办到。
for(i=0;i a[i]=0;


i= 0;j=0;k=0;
do{



for(k=0;k {
i=(i+1)%N;     //,第i 个人就是现在拿土豆的人。每次开始前,围城一圈人都是未曾离席的,所以i 先加往下传。如果k=0,即表示不用传,自己离席,而在for开始的时候就判断了,如果不用传,for结构就不会运行。
if(a[i]==0)    //遇到有效的人,才计数
k++;
}
a[i] = 1;    //这个人是传递了第M次土豆的人,离席。
printf("%d ",i+1);
while(a[++i]!=0);  //将土豆交给下一个有效的人(未曾离席的人,继续传递),则现在土豆在第i个人手上。
j++;      //已经离席的人数统计


}while(j+1 != N);   //是否已经离席了N-1 个人,则最后一个让你就是胜利者


     printf("\n");


     for(i=0 ;i printf("%d ",a[i]);
/* if(a[i] == 0)
{
printf("%d \n",i);
break;
}*/
}
阅读(563) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~