已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
如何编写算法,最近事情太多了,哪位同志帮帮忙静态数组问题
- 提问者网友:轻浮
- 2021-04-20 12:08
- 五星知识达人网友:青灯有味
- 2021-04-20 13:20
用链表处理:
#include<stdio.h>
#include<malloc.h>
struct num{
int i;
struct num *next;
};
struct num *creat(int n){
struct num* p1,*p2,*head;
int m=2;
head=p1=p2=(struct num*)malloc(sizeof(struct num));
p1=(struct num*)malloc(sizeof(struct num));
p2->next=p1;
p2=p1;
(p1->i)=m;
m++;
}
p2->next=head;
return head;
}
int main(){
int n,m=2;
struct num *p;
printf("please enter the total num:");
scanf("%d",&n);
p=creat(n);
while(p->next!=p){
if(m!=3){
p=p->next;
m++;
}
else{
(p->next)=(p->next)->next;
m=1;
}
}
printf("%d",p->i);
return 0;
}
用指针处理:
#include<stdio.h>
int main(){
int num[50],*p,n,m,i=1,k=0;
printf("please enter the num:");
scanf("%d",&n);
for(m=1;m<=n;m++)
num[m]=m;
p=&num[1];
m=0;
while(1){
if(m>=n)
m=0;
if(*(p+m)==0){
m++;
continue;
}
if(i==3){
*(p+m)=0;
i=1;
k++;
m++;
}
else{
m++;
i++;
}
if(k==n-1)
break;
}
for(;*p==0;p++)
;
printf("%d\n",*p);
return 0;
}
一个巧妙的算法:
#include <stdio.h>
const int M = 3;
int main()
{
int i,n, s = 0;
scanf("%d", &n);
for (i=2;i<=n;++i)
s = (s+M)%i;
printf("%d\n", s+1);
return 0;
}