报数游戏求解(新手)
18个人围做一起,从1开始报数,数到3或其倍数的人离开,其他人继续,直到剩下最后一人为止。
[解决办法]
月经贴。。。。。。
#include <stdio.h>
#define M 18
#define N 3
int main()
{
int data[M] ;
int i=0 ;
int left = M ;
int cur = 0 ;
for(i=0; i <M; i++)
data[i] = 1 ;
i=0;
while(left > 1)
{
if(data[i])
{
if(++cur == N)
{
cur = 0 ;
data[i] = 0 ;
if(i==0)
i=M;
printf( "output %d.\n ", i) ;
left-- ;
}
}
i = (++i)%M ;
}
for(i=0; i <M; i++)
if(data[i])
{
if(i==0)
i=M;
printf( "output %d.\n ", i) ;
}
return 0 ;
}
[解决办法]
/*递归实现*/
#include <iostream>
using namespace std;
//本程序以从1开始数,数到3离队为例,其它情况只用少加修改
void make(int *base,int n,int pos,int c)
{
int j=0;
cout < < "NO. " < <++c < < " 第 " < <pos+1 < < "位出列 " < <endl;//输出
base[pos]=0;//踢掉
if(c==n)return; //出口
while(j-3)if(base[pos=(pos+1)%n])j++;//递归点 ,每次数到几这个3就改到几
make(base,n,pos,c);//递归
}
int main()
{
int n,c=0,pos=2;//从N开始数,则把pos改为N-1就行了.
cout < < "请输入总人数 " < <endl;
cin> > n;
int *base=new int[n];
for(int i=0;i <n;i++)base[i]=1;
make(base,n,pos,c);
delete[]base;
system( "PAUSE ");
return 0;
}
[解决办法]
/*约瑟夫环*/
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{
int data;
struct node *next;
}LNode;
main()
{
LNode* Create(int,int);
LNode* GetNode(LNode *);
int Print(LNode *,int);
LNode *p;
int n,k,m;
do
{
printf ( "输入总人数 ");
scanf ( "%d ",&n);
}
while (n <=0);
do
{
printf ( "输入开始人的序号(1~%d) ",n);
scanf ( "%d ",&k);
}
while (k <=0 || k> n);
do
{
printf ( "输入间隔数字 ");
scanf ( "%d ",&m);
}
while(m <=0);
p=Create(n,k);
Print(p,m);
return 0;
};
LNode* Create(int n,int k)/*创建循环链表*/
{
int start=k-1;
LNode *s,*p,*L=0,*t;
if (start==0) start=n;
while (n!=0)
{
s=(LNode *)malloc(sizeof(LNode));
if (L==0) p=s;
if (n==start) t=s;
s-> data=n;
s-> next=L;
L=s;
n--;
}
p-> next=L;
return t;
}
LNode* GetNode(LNode *p)/*出队函数*/
{
LNode *q;
for (q=p;q-> next!=p;q=q-> next);
q-> next=p-> next;
free (p);
return (q);
}
Print(LNode *p,int m)/*输出函数*/
{
int i;
printf ( "出队编号:\n ");
while (p-> next!=p)
{
for (i=1;i <=m;i++)
p=p-> next;
printf ( "%d ",p-> data);
p=GetNode(p);
}
printf( "%d\n ",p-> data);
return 0;
}