一小段C语言代码,求指教逻辑或者算法错误
代码实现的功能为:有n个人排成一圈,顺序编号,从第一个人开始1到3报数,报到3的退出圈子,问最后留下的是几号。我的想法是用(j%3,j++)给变量编码,当i到30的时候变...
代码实现的功能为:有n个人排成一圈,顺序编号,从第一个人开始1到3报数,报到3的退出圈子,问最后留下的是几号。我的想法是用(j%3,j++)给变量编码,当i到30的时候变回1,执行条件是count<=28以及a[i]!=0以保证最后会留下一个数。
求指教出我的错误,或者提供一个更优秀的算法供我学习,谢谢了
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int a[31]={0},i=0,j=0,k=0,count=0;
for(k=0;k<=30;k++)
{a[k]=1;}
while(count<=28)
{
i++;
if(i>30) i=0;
else if(a[i]!=0)
{
j++;
a[i]=(j%3);
if((j%3)==0) count++;
}
}
for(i=1;i++;i<=30)
{if(a[i]!=0)
printf("%d\n",a[i]);}
printf("%d",count);
getchar(); 展开
求指教出我的错误,或者提供一个更优秀的算法供我学习,谢谢了
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int a[31]={0},i=0,j=0,k=0,count=0;
for(k=0;k<=30;k++)
{a[k]=1;}
while(count<=28)
{
i++;
if(i>30) i=0;
else if(a[i]!=0)
{
j++;
a[i]=(j%3);
if((j%3)==0) count++;
}
}
for(i=1;i++;i<=30)
{if(a[i]!=0)
printf("%d\n",a[i]);}
printf("%d",count);
getchar(); 展开
3个回答
展开全部
猴子选大王,一般是用循环队列或者链表来做
1.需求分析:
根据问题描述可知,该问题中m个猴子围坐在一起形成首尾相接的环,因此可用循环链表解决。从第n个猴子开始出列相当于从链表中删除一个结点。该程序主要有三个模块组成,建立单链表,报数利用do-while循环实现猴子的出列,最终剩下的猴子即猴王。具体步骤如下:
第一步 首先创建循环链表。
第二步 向单链表中填入猴子的编号
第二步 找第一个开始报数的猴子。
第三步 数到n让这个猴子出列。
第四步 接着开始报数,重复第三步
2.概要设计(流程图)
开始
定义结构体,变量
建立循环单链表
在循环链表填入数据
猴子数数Count++
Count= = n-1?
释放第n个猴子
指针q指向第n+1个节点q=q->next
否
q->next= =q?
是
猴王就是第q-〉data 个猴子
结束
3.详细设计:
#include
#include
struct Node
{
int data;
struct Node *next;
};
int main()
{
struct Node *head, *s, *q, *t;
int n, m, count=0, i;
printf("input the number m:");
scanf("%d",&m);
printf(" input the number n:");
scanf("%d",&n);
for(i=0; i< i++)>
{
s=(struct Node *)malloc(sizeof(struct Node));
s->data=i+1;
s->next=NULL;
if(i= =0)
{
head=s;
q=head;
}
else
{
q->next=s;
q=q->next;
}
}
q->next=head;
printf("before:");
q=head;
while(q->next!=head)
{
printf("%d ",q->data);
q=q->next;
}
printf("%d ",q->data);
q=head;
printf(" ");
do {
count++;
if(count= =n-1)
{
t=q->next;
q->next=t->next;
count=0;
printf("%d ", t->data);
free(t);
}
q=q->next;
}
while(q->next!=q);
printf(" the king is: %d ",q->data);
}
4.测试数据:
1)input the number m:20
input the number n:5
before:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
5 10 15 20 6 12 18 4 13 1 9 19 11 3 17 16 2 8 14
the king is: 7
2)input the number m:9
input the number n:11
before:1 2 3 4 5 6 7 8 9
2 5 9 7 8 4 1 3
the king is: 6
3)input the number m:10
input the number n:5
before:1 2 3 4 5 6 7 8 9 10
5 10 6 2 9 8 1 4 7
the king is: 3
1.需求分析:
根据问题描述可知,该问题中m个猴子围坐在一起形成首尾相接的环,因此可用循环链表解决。从第n个猴子开始出列相当于从链表中删除一个结点。该程序主要有三个模块组成,建立单链表,报数利用do-while循环实现猴子的出列,最终剩下的猴子即猴王。具体步骤如下:
第一步 首先创建循环链表。
第二步 向单链表中填入猴子的编号
第二步 找第一个开始报数的猴子。
第三步 数到n让这个猴子出列。
第四步 接着开始报数,重复第三步
2.概要设计(流程图)
开始
定义结构体,变量
建立循环单链表
在循环链表填入数据
猴子数数Count++
Count= = n-1?
释放第n个猴子
指针q指向第n+1个节点q=q->next
否
q->next= =q?
是
猴王就是第q-〉data 个猴子
结束
3.详细设计:
#include
#include
struct Node
{
int data;
struct Node *next;
};
int main()
{
struct Node *head, *s, *q, *t;
int n, m, count=0, i;
printf("input the number m:");
scanf("%d",&m);
printf(" input the number n:");
scanf("%d",&n);
for(i=0; i< i++)>
{
s=(struct Node *)malloc(sizeof(struct Node));
s->data=i+1;
s->next=NULL;
if(i= =0)
{
head=s;
q=head;
}
else
{
q->next=s;
q=q->next;
}
}
q->next=head;
printf("before:");
q=head;
while(q->next!=head)
{
printf("%d ",q->data);
q=q->next;
}
printf("%d ",q->data);
q=head;
printf(" ");
do {
count++;
if(count= =n-1)
{
t=q->next;
q->next=t->next;
count=0;
printf("%d ", t->data);
free(t);
}
q=q->next;
}
while(q->next!=q);
printf(" the king is: %d ",q->data);
}
4.测试数据:
1)input the number m:20
input the number n:5
before:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
5 10 15 20 6 12 18 4 13 1 9 19 11 3 17 16 2 8 14
the king is: 7
2)input the number m:9
input the number n:11
before:1 2 3 4 5 6 7 8 9
2 5 9 7 8 4 1 3
the king is: 6
3)input the number m:10
input the number n:5
before:1 2 3 4 5 6 7 8 9 10
5 10 6 2 9 8 1 4 7
the king is: 3
展开全部
你现在初始共有几个人,怎么开始有31,count<=28,保证最后会留下一个数?
最后,程序的要求是只要最后一个数,还是要出列的全部过程?
最后,程序的要求是只要最后一个数,还是要出列的全部过程?
更多追问追答
追问
数组含有零项,所以需要31个,而且我的处理过程是忽略零项的。我的代码中当count到了28时,会再执行一次,即排除掉29个
追答
#include
int main()
{
int a[31],i,j=0,count=0;
for(i=0;i<=30;i++)
{a[i]=1;}
while(count<31)
{
j+=a[i];
if(j==3)
{
count++;
a[i]=0;
j=0;
printf("%d ",i+1);
}
if(i<30)i++;
else i=0;
}
printf("\n");
getchar();
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个我觉得只能逐个模拟,满足相应条件回归,比如满3归0,到30号归1,只剩下1个,结束,单纯用J%3,J++,应该实现不了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询