#include
#define N 10
void main()
{
char student[N];//N个人,1表示未退出,0表示已经退出
int out[N];//退出的人的号码记录
int count = -1;//循环计数 0,1,2 <=> 1-3
int num_out = -1;//退出号码记录的数组的下标
memset(student, 1, sizeof(student));//将所有人状态置为1(未退出)
for (int i = 0; i < N && num_out < N - 1; i = ++i % N)
{
if (1 == student[i] && 2 == ++count%3)
{
//未退出的人计数到2的人标记退出,并将号码保存到out数组中
student[i] = 0;
out[++num_out] = i;
}
}
//循环输出退出的号码
for (int i = 0; i < N; ++i)
{
printf("%d\t", out[i]+1);
}
}
PS:刚写的,简单验证过:OK
我的想法是建立一个数组,下标就是人的编号,每遍历3个人,就把当前的元素值设置为0
下次报数忽略元素值为0的元素。i表示真实的数组下标,j表示第j个数
#include
#include
int main()
{
int n, i, j, count = 0;
scanf("%d", &n);
int *no = (int*)malloc((n + 1)*sizeof(int));
for (i = 1; i <= n; ++i)
no[i] = i;
while (n - count >= 3)
{
for (i = 1, j = 1; i <= n; ++i)
{
if (no[i] == 0)
continue;
if (j%3 == 0)
{
printf("%d ", no[i]);
no[i] = 0;
++count;
}
++j;
}
printf("\n");
}
return 0;
}
:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下来的是原来第几号的那位。(要求用指针链表实现)
#include
#include
#define N sizeof(struct student)
int main()
{
struct student
{
int a;
int b;
struct student *next;
};
struct student *p,*q,a;
int n,b=0,i;
printf("请输入n:");
scanf("%d",&n);
p=q=(struct student *)malloc(N);
a.next=p;
for(i=0;i
q=(struct student *)malloc(N);
p->a=i+1;
p->b=1;
p->next=q;
p=p->next;
}
p->next=a.next;
p=a.next;
for(i=1;i
if(p->b==1)
{
b++;
if(b==3)
{b=0;p->b=0;i++;}
}
p=p->next;
}
printf("最后出来的是第:");
p=a.next;
for(i=1;i<=n;i++)
{
if(p->b==1)
printf("%d个人\n",p->a);
p=p->next;
}
return 0;
}
#include
using std::cin;
using std::cout;
int main()
{
int n;
cout<<"请输入n= ";
cin>>n;
if(n<2)
{
cout<<"n必须大于2!\n请重新输入n= ";
cin>>n;
}
bool * a = new bool [n+1];
a[0]=false;
for(int i=1;ia[i]=true;
int x,k=n;x=i=0;//i为每次循环计数变量,x为人员序号,K为剩余人数
while(k!=0)
{
x++;
if(x>n) x=1;//当人员到达数组尾,序号重设为1
if(a[x])i++; // 跳过已退出人员
if(i==3)
{a[x]=false;i=0;k--;}//当数到3时,退出人员设为false,剩余人数减1,i设为0,重新计数
}
cout<<"留下来的人序号为: "<delete [] a;
cin.get();
cin.get();//等待下一次键击关闭窗口
return 0;
}
请认真写作业。