user-0 提问: 耶稣有13个门徒,其中有一个就是出卖耶稣的人,报数,1,2,3,1,2,3,1,2,3...凡是报到3的就退出圈子,最后留在圈中的就是出卖耶稣的叛徒,请找出它原

回复:
user: user-1
content: 能用数据结构编写么，约瑟夫

user: user-2
content: 为啥我的答案是2.

user: user-0
content: 终于有自己的耶稣了,哈哈哈.. #define M 13//M为总人数 #define N 3 //N为循环单元     int a[M] = {0}, count = 0, people = M;//count计数(0-3), people为当前人数     printf("原序列:\n");     for (int i = 1; i <= M; i++) {         a[i - 1] = i;         printf("%d ", a[i - 1]);     }//赋值     printf("\n开始排除...\n");     while (people > 1) {//当前人数大于一时,继续进入循环进行排除         for (int p = 0; p < M; p++) {//排除的趟数循环             if (a[p] != 0) {                 count++;             }//如果当前数不为0,则count加1,直到count为3             if (count == N) {                 printf("%d被排除\n排除后的序列为:\n", a[p]);//排除当前数                 a[p] = 0;//当前数标记为0,说明已被排除                 for (int i = 0; i < M; i++) {                     printf("%d ", a[i]);                 }//打印本趟排除后的序列结果                 printf("\n");                 count = 0;//重新计数                 people--;//当前人数减1             }         }     }     for (int i = 0; i < M; i++) {         if (a[i] != 0) {             printf("%d是叛徒\n", a[i]);         }//遍历序列,若不为0则为叛徒     }

user: user-0
content: 引用 26 楼 u013491662 的回复: #include <stdio.h> int main() { 	int a[7] = { 0 }, count = 0, number = 7, p = 0, q = 0; 	for (int i = 0; i < 7; i++) { 		a[i] = i; 	} 	while (number > 0) { 		//数组a:0 1 2 3 4 5 6 		for (int i = count; i < number; i++, count++) { 			if ((count + 1) % 3 == 0) { 				printf("%d被排除\n", a[count]); 				a[count] = 8;//8为清除代码 				p = count + 1; 				q = count; 			} 		} 		//数组a:0 1 8 3 4 8 6 		int t[] = { 0 }, j = 0;//数组t:0   数组t里就一个元素！ 		for (j = 0; j < number % 3; j++, p++) { 			t[j] = a[p]; 			printf("新序列:%d ", t[j]); 		} 		//数组t：6 		//j等于1 		for (int i = 0; i < q; i++) { 			if (a[i] != 8) { 				t[j] = a[i];//第一次执行，j等于1，下标越界 				j++; 			} 		} 		p = 0; 		number -= (count / 3); 		count = 0; 		if (number == 1) { 			printf("出卖耶稣的人的序号为%d", a); 		} 	} 	return 0; }  果然是大神啊,我百思不得其解,最后放弃了,换了一种方法

user: user-3
content: #include <stdio.h> int main() { 	int a[7] = { 0 }, count = 0, number = 7, p = 0, q = 0; 	for (int i = 0; i < 7; i++) { 		a[i] = i; 	} 	while (number > 0) { 		//数组a:0 1 2 3 4 5 6 		for (int i = count; i < number; i++, count++) { 			if ((count + 1) % 3 == 0) { 				printf("%d被排除\n", a[count]); 				a[count] = 8;//8为清除代码 				p = count + 1; 				q = count; 			} 		} 		//数组a:0 1 8 3 4 8 6 		int t[] = { 0 }, j = 0;//数组t:0   数组t里就一个元素！ 		for (j = 0; j < number % 3; j++, p++) { 			t[j] = a[p]; 			printf("新序列:%d ", t[j]); 		} 		//数组t：6 		//j等于1 		for (int i = 0; i < q; i++) { 			if (a[i] != 8) { 				t[j] = a[i];//第一次执行，j等于1，下标越界 				j++; 			} 		} 		p = 0; 		number -= (count / 3); 		count = 0; 		if (number == 1) { 			printf("出卖耶稣的人的序号为%d", a); 		} 	} 	return 0; }

user: user-4
content: 来个数学解法，结果为13 //约瑟夫环问题数学解法,时间复杂度为O(n) //约瑟夫环问题数学解法,时间复杂度为O(n) #include <stdio.h>  #define N 13 #define M  3  int main(void)  {     int i, s = 0;           for (i = 2; i <= N; ++i)        s = (s + M) % i;        printf("叛徒 is %d\n", s + 1);    return 0; }

user: user-0
content: 引用 22 楼 u013491662 的回复:那段代码是我刚学C的时候写的，所以跟别人的比不是很好，你的代码有什么bug？贴出来 int a[7] = {0}, count = 0, number = 7, p = 0, q = 0; for (int i = 0; i < 7; i++) {     a[i] = i; }while (number > 0) {     for (int i = count; i < number; i++, count++) {         if ((count + 1) % 3 == 0) {             printf("%d被排除\n", a[count]);             a[count] = 8;//8为清除代码             p = count + 1;             q = count;         }     }     int t[] = {0}, j = 0;     for (j = 0; j < number % 3; j++, p++) {         t[j] = a[p];         printf("新序列:%d ", t[j]);     }     for (int i = 0; i < q; i++) {         if (a[i] != 8) {             t[j] = a[i];             j++;         }     }     p = 0;     number -= (count / 3);     count = 0;     if (number == 1) {         printf("出卖耶稣的人的序号为%d", a);     } } 求大神帮一下

user: user-5
content: 初学编程时遇到这类问题先甭管它属于什么问题，一定要先思考，再用循环加数组进行动手操作，这是最能锻炼的了。

user: user-6
content: 最后那个人的编号是不是2呀！

user: user-3
content: 那段代码是我刚学C的时候写的，所以跟别人的比不是很好，你的代码有什么bug？贴出来

user: user-0
content: 引用 4 楼 henry3695 的回复: //我来个递归的 //.c代码还真不太好写，函数申明无参数，变量都要放到开头，不习惯呵呵  #include "stdio.h" int find_last(int*,int); void  main() { 	int a[13]; 	int i; 	int last_id; 	for(i=0;i<13;i++) 	{ 		a[i]=i+1; 	}	  	last_id =find_last(a,13);  	printf("出卖者:a[%d] = %d \n",last_id,a[last_id]);  }  int find_last(int* p,int nlen) { 	int size=0; 	int i=0; 	int t=0; 	for (;i<nlen;i++) 	{ 		if (p[i]>0) 		{ 			size++; 		} 	} 	if (size==1) 	{ 		for (i=0;i<nlen;i++) 		{ 			if (p[i]>0) 			{ 				return i; 			} 		} 		return -1; 	}	 	i = 0; 	while(1) 	{ 		if(i == nlen) 		{ 			i = 0; 		} 		 		if (p[i]>0) 		{ 			t++; 			if (t==3) 			{ 				p[i]=0; 				break; 			} 		} 		i++; 	} 	return find_last(p,nlen); }  方法和思路都很好, 但结果是不是不正确啊..

user: user-0
content: 引用 1 楼 u013491662 的回复:仅供参考  #include <stdio.h> int main() { 	int a[13]; 	for (int i = 0; i < 13; i++) 		a[i] = 1; 	void fun(int *, int); 	fun(a, 13); 	return 0; } void fun(int *a, int size) { 	int flag = 0,mun = size,*yuan=a; 	while (mun > 1) 	{ 		for (flag = 1; flag < 4; flag++) 		{ 			if (a == yuan + size) 				a = yuan; 			while (*a == 0) 			{ 				a++; 				if (a == yuan + size) 					a = yuan; 			} 			if (flag == 3) 			{ 				*a = 0;  				mun--; 			} 			a++; 		} 	} 	a = yuan; 	for (; a < yuan + size;a++) 		if (*a != 0) 		{ 		printf("是原来第%d号！\n", a - yuan + 1); 		break; 		} }  大神啊,你的方法是对的,我都想了一天了这个题,但我的还是有bug

user: user-0
content: 引用 18 楼 u013294728 的回复:int people[13] = {0}; int person = 0, i = 0, count3 = 0;  // 数组用来存放所有的人 一开始都为0 出来为1  person表示出来几个人， count3是一个关于3的计数器   while( person < 12) {  //13个人 出来12个人就OK  if(people[i] == 0) //为0 表示还没出来   { count3++; //计3计数器自加   if (count3 = 3)  //为3就出来 {   people[i] = 1;  //到3了 说明有人要出来了 把它变成1   person++; //出来一个人 person计数器自加 count3 = 0; //出来后清0 printf("%d", i); } }  i++;  //这一块控制循环做 if( 13 == i) {    i = 0; }  } 不对吧,count3 = 3的时候是第四个了,请问您运行过吗?

user: user-7
content: int people[13] = {0}; int person = 0, i = 0, count3 = 0;  // 数组用来存放所有的人 一开始都为0 出来为1  person表示出来几个人， count3是一个关于3的计数器   while( person < 12) {  //13个人 出来12个人就OK  if(people[i] == 0) //为0 表示还没出来   { count3++; //计3计数器自加   if (count3 = 3)  //为3就出来 {   people[i] = 1;  //到3了 说明有人要出来了 把它变成1   person++; //出来一个人 person计数器自加 count3 = 0; //出来后清0 printf("%d", i); } }  i++;  //这一块控制循环做 if( 13 == i) {    i = 0; }  }

user: user-8
content: 引用 14 楼 user-9 的回复:[quote=引用 13 楼 vaercly 的回复:] [quote=引用 8 楼 user-9 的回复:] 这种问题属于初学编程的练习题，不需要提问，直接google搜代码就有 自己写的话，稍微细心些都能写好 主要是想锻炼一下自己的逻辑,结果发现真的相不出来[/quote]  不用循环链表也能实现，std::list也行 甚至数组都行，就看你自己懒不懒了[/quote] 开始学的时候最好还是不要依赖STL，还是要自己研究一下算法会比较好点

user: user-8
content: 引用 12 楼 vaercly 的回复:[quote=引用 9 楼 kannimad 的回复:] 为什么不用循环链表呢。。。感觉会好理解很多？？还是我哪里没考虑到 循环链表太高级,小弟学的不精啊[/quote] 没事，自己在开始学的时候在谭的书里看过也不会，现在自学数据结构，这种问题就会变得轻松多了

user: user-7
content: 约瑟夫环 等会上code

user: user-9
content: 引用 13 楼 vaercly 的回复:[quote=引用 8 楼 user-9 的回复:] 这种问题属于初学编程的练习题，不需要提问，直接google搜代码就有 自己写的话，稍微细心些都能写好 主要是想锻炼一下自己的逻辑,结果发现真的相不出来[/quote]  不用循环链表也能实现，std::list也行 甚至数组都行，就看你自己懒不懒了

user: user-0
content: 引用 8 楼 user-9 的回复:这种问题属于初学编程的练习题，不需要提问，直接google搜代码就有 自己写的话，稍微细心些都能写好 主要是想锻炼一下自己的逻辑,结果发现真的相不出来

user: user-0
content: 引用 9 楼 kannimad 的回复:为什么不用循环链表呢。。。感觉会好理解很多？？还是我哪里没考虑到 循环链表太高级,小弟学的不精啊