问题描述
- 今天的面议题,帮忙解答下!
-
有17个人,编号0-16,第0人从1开始报数,报到3的倍数的人排除,直到最后一人,请问最后一人的位置是多少?请用程序代码实现,
解决方案
google 约瑟夫环 C语言,答案就有。
解决方案二:
#include
int main()
{
int i,test,p[17],head;
for(i=0;i<16;i++)
p[i]=i+1;
p[16]=0;
test=0;
while(test!=p[test])
{
for(i=1;i<3;i++)
{
head=test;
test=p[test];
}
p[head]=p[test];
test=p[head];
}
printf("n%5d",test);
return 0;
}
解决方案三:
用链表的形式正好也写了一个
输出的格式是我自己写的格式,和你想要的格式可能不同,
比如输入8 3 4
输出
输入0 0 0
停止
#include
#include
#define M 300
typedef int ElemType;
typedef struct node
{
ElemType data[M];
int length;
}sqlist;
void creat(sqlist *l)
{
l=(sqlist *)malloc(sizeof(sqlist));
l->length=0;
}
void creatfullsqlist(sqlist *l,int n)
{
int i;
for(i=0;i
{
l->data[i]=i+1;
}
l->length=n;
}
void yuesefu(sqlist *l1,sqlist *l2,int n,int p,int m)
{
int i,j;
for (i=n;i>0;i--)
{
l2->data[n-i]=l1->data[(p+m-2)%i];
if(i!=1)
{
printf ("%d,",l2->data[n-i]);
}
if(i==1)
{
printf ("%d ",l2->data[n-i]);
}
if ((p+m-2)%i!=i-1)
for (j=(p+m-2)%i+1;j
l1->data[j-1]=l1->data[j];
p=(p+m-2)%i+1;
}
printf ("n");
}
int main()
{
sqlist l1, l2;
int n,p,m;
while(scanf("%d%d%d",&n,&p,&m)==3 && n!=0 && p!=0 && m!=0)
{
creat(&l1);
creatfullsqlist(&l1,n);
creat(&l2);
yuesefu(&l1,&l2,n,p,m);
}
return 0;
}
解决方案四:
public class Test_line {
int temp = 1;
/**
* @param args
*/
public static void main(String[] args) {
List<Integer> num = new ArrayList<Integer>();
for(int i=0 ; i<17 ; i++){
num.add(i);
}
System.out.println(new Test_line().find(num, 1));
}
public int find(List<Integer> num , int y){
temp += num.size();
if(num.size() > 1){
for(int i=0; i<num.size() ; i++){
if((i+y) % 3 == 0){
System.out.println("RM>>>" + num.get(i));
num.set(i,-1);
}
}
Integer n = -1;
for(int i=0; i<num.size() ; i++){
num.remove(n);
}
find(num,temp);
}
return num.get(0);
}
}