user-0 提问: 新人求教：n个人从1号玩家从1开始报数。3的倍数或者个位数字为3的玩家退出游戏，求最后一个人序号

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> int main() { 	int i,j,n,m,a[1000]; 	scanf("%d",&n); 	memset( a, 0, sizeof(a) ); 	for( i=0; i<n; i++ ) 	{ 		a[i] = i+1; 	} 	i = 1; 	j = 0; 	while(1) 	{ 		if( n <= 1 ) break; 		if( i%3==0 || i%10==3 ) 		{ 			for( m=j; m<n-1; m++ ) 				a[m] = a[m+1]; 			j--; 			n--; 		} 		i++; 		j++; 		if( j>=n ) j=0; 	} 	 	printf("%d ",a[0]); 	system("pause"); 	return 0; }

user: user-1
content: 引用 5 楼 qq_22121237 的回复:[quote=引用 2 楼 xionggch 的回复:]  #include<stdio.h> #include<stdlib.h> int main() {  	int i,j,n,m,a[1000]; 	scanf("%d",&n); 	memset( a, 0, sizeof(a) ); 	m = n; 	i = 1; 	j = 0; 	while(1) 	{ 		if( m <= 1 ) break; 		while(1) 		{ 			if( j>=n ) j=0; 			if( a[j] == 0 ) break; 			j++;	 		} 		if( i%3==0 || i%10==3 ) 		{ 			a[j] = 1; 			m--; 		} 		i++; 		j++; 	}  	for(i=0;i<n;i++) 	{ 		if( a[i] == 0) 		{ 			printf("%d ",i+1); 		} 	} 	system("pause"); 	return 0; }  我理解这个程序的思路了 可是为什么 提交答案后 有一个测试数据显示的是 运行时错误啊 其他4个测试数据都对的[/quote] 那个测试数据有错误？什么错误？

user: user-2
content: 原题：一组人（n）个，围成一圈，从某人开始数到3的人出列，在接着从下一个人开始数，最终输出最终出列的人（约瑟夫环是一个数学的应用问题：已知n个人（以编号1,2,3,...,n）分别表示）围坐在一张圆桌周围。从编号k的人开始报数，数到m的那个人出列；他的下一个人又从1开始报数，数到m的那个人又出列：依此规律重复下去，知道圆桌周围的人全都出列。 #include <iostream>   #include <list>   #include <vector>   #include <algorithm>   using namespace std;   vector<int> yuesefeng(int n,int m);   void main()   {   	int n,m;   	cin>>n>>m;   	vector<int> out;   	out=yuesefeng(n,m);   	int i,len=out.size();   	for(i=0;i<len;i++)   		cout<<out[i]<<" ";   	while(1);   }   vector<int> yuesefeng(int n,int m)//n代表初始人数，m代表初始号码   {   	vector<int> out;   	list<int> in;   	list<int>::iterator pos;   	int i;   	for(i=1;i<=n;i++)   		in.push_back(i);   	pos=in.begin();   	int kk=m;   	while(in.size()!=0)   	{      		if(kk!=1)   		{   			pos++;   			kk--;   			if(pos==in.end())//注意要判断是否到尾部了，到尾部就指向头部   				pos=in.begin();   		}   		else   		{   			out.push_back(*pos);//到数了，点到的人保存到输出   			pos=in.erase(pos);///将此人从列表中删除，注意erase返回的是下个人的指针   			if(pos==in.end())   				pos=in.begin();   		}          	}   	return out;   }

user: user-2
content: 类似约瑟芬环的问题，可以用STL中的list来做

user: user-3
content: //if(a[m]%3!=0 || a[m]%10!=3)a[j++]=a[m];//这里改为下面这行 if(a[m]%3!=0 && a[m]%10!=3)a[j++]=a[m];  注意条件的转换，结果如下：

user: user-1
content: #include<stdio.h> #include<stdlib.h> int main() {  	int i,j,n,m,a[1000]; 	scanf("%d",&n); 	memset( a, 0, sizeof(a) ); 	m = n; 	i = 1; 	j = 0; 	while(1) 	{ 		if( m <= 1 ) break; 		while(1) 		{ 			if( j>=n ) j=0; 			if( a[j] == 0 ) break; 			j++;	 		} 		if( i%3==0 || i%10==3 ) 		{ 			a[j] = 1; 			m--; 		} 		i++; 		j++; 	}  	for(i=0;i<n;i++) 	{ 		if( a[i] == 0) 		{ 			printf("%d ",i+1); 		} 	} 	system("pause"); 	return 0; }

user: user-0
content: 引用 2 楼 xionggch 的回复: #include<stdio.h> #include<stdlib.h> int main() {  	int i,j,n,m,a[1000]; 	scanf("%d",&n); 	memset( a, 0, sizeof(a) ); 	m = n; 	i = 1; 	j = 0; 	while(1) 	{ 		if( m <= 1 ) break; 		while(1) 		{ 			if( j>=n ) j=0; 			if( a[j] == 0 ) break; 			j++;	 		} 		if( i%3==0 || i%10==3 ) 		{ 			a[j] = 1; 			m--; 		} 		i++; 		j++; 	}  	for(i=0;i<n;i++) 	{ 		if( a[i] == 0) 		{ 			printf("%d ",i+1); 		} 	} 	system("pause"); 	return 0; }  我理解这个程序的思路了 可是为什么 提交答案后 有一个测试数据显示的是 运行时错误啊 其他4个测试数据都对的

user: user-0
content: 引用 3 楼 u011337306 的回复: //if(a[m]%3!=0 || a[m]%10!=3)a[j++]=a[m];//这里改为下面这行 if(a[m]%3!=0 && a[m]%10!=3)a[j++]=a[m];  注意条件的转换，结果如下：  为啥用&&   &&不是同时满足条件1和条件2吗

user: user-0
content: #include<stdio.h> #include<stdlib.h> #include<math.h> #include <string.h>   int main() { 	int i,j,n,m,a[65535]; 	scanf("%d",&n); 	for(i=0;i<n;i++) 		a[i]=i+1; 	for(m=j=0;m<n;m++) 		if(a[m]%3!=0 || a[m]%10!=3)a[j++]=a[m];     for(m=0;m<j;m++) 		printf("%d ",a[m]);           system("pause");     return 0; }  还有就是上面这段代码 运行后 输入10 输出是1 2 4 5 6 7 8 9 10 为什么6 9 不被去掉啊？？？