《约瑟夫生者死者游戏》算法 C语言版

算法课上的一个小练习,线性结构的表示与实现之二-------顺序表的简单应用《约瑟夫生者死者游戏

    问题描述和求解思路在源码中已经注释出来了,进攻参考,后面的一份是一开始写的,效率极低,当做反面教材了。

#include
/*
	约瑟夫问题求解——数组存储方式算法
	
	姓名:曹栋
	题目描述:
		  约瑟夫生者死者游戏:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉大家,
		  只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,并议定30个人围
		  成一圈,由第一个人开始,依次报数,数到第9个人,就把他投入大海中,然后从他的下一个人开始从1数
		  起,数到第9个人,再将她投入大海,如此循环,直到剩下15个人乘客为止。问哪些位置是将被扔到大海的
		  位置。
	思路:规定数组30个元素值依次为1-30,跳水的元素置0;
		  循环技术变量每经过一个非0值需要加1同时报数计数变量也加1,由于是循环计数,所以将number%30,
		  如果经过0值时则需要只将number+1即跳过数组中的0元素,因为在报数时,已经跳水的人不再参与报数。
		  报数变量count累加到9后即将对应的数组元素清零,同时status变量+1;
*/

void main(){

	int status=0;//跳水人数变量
	int a[30];
	int i=0;
	int number=0;//循环计数变量,取值范围1~算法结束时总共数过多少人
	int count=0;//1-9报数变量
	//初始化数组
	for(i;i<30;i++)
		a[i]=i+1;
	//算法begin
	while(status<15){
		if(a[number%30]!=0){
			if(count==8){
				a[number%30]=0;
				number++;
				count=0;
				status++;
				printf("第%d次跳水的为%d\n",status,number%30);
			}
			else{
				count++;
				number++;
			}
		}
		else
			number++;
	}
	//打印结果
	printf("留在船上的为:");
	for(i=0;i<30;i++)
		if(a[i]!=0)
			printf("%d,",a[i]);
}

下面是效率极低的一个算法

#include 
void main(){
	int a[30];
	int status=0;
	int number=1;
	int j=1;
	int k=1;
	int i=1;
	int q=1;
	for(j;j<=30;j++){
		a[j-1]=j;	
	}
	
	while(status<15){
		while(i<9){
			while(a[(number-1)%30]==0){
				number++;	
			}
			i++;
			number++;
		}
		i=1;
		while(a[(number-1)%30]==0){
				number++;	
			}
		a[(number-1)%30]=0;
		number++;
		status++;

		k=1;
		while(k<=30){
		printf("%d,",a[k-1]);
		
		k++;
			}
		printf("\n");
		
	}
	
	
		printf("over \n,");
	
}


你可能感兴趣的:(算法合集)