The Second Blog -数组实现约瑟夫问题-C语言
2014-06-05 20:06
351 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100 // 总人数 #define M 7 // 数数周期 每数M个就要淘汰一个 int main() { int num ; int index; for (index=0; index<N; ++index) //初始化进行编号 { num[index] = index+1; } int count=N;//未被淘汰人数 int mod=0; //计数器,记到周期数就淘汰 index=0; while(count>1) { if(num[index]!=0) //此人未被淘汰 { mod++; if(mod==M) { num[index]=0; //淘汰此人 mod=0; //重置计数器 count--; //总人数减一 } //数到3个人 变回零 index=(index+1)%N; //构成循环 } else { index=(index+1)%N; } } for(index=0;index<N;++index) { if(num[index]!=0) printf("胜出者为%d",num[index]); } system("pause"); return 0; }
//强制转换跳转方式
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100 // 总人数 #define M 7 // 数数周期 每数M个就要淘汰一个 int main() { int str ; int i,count,mod; //下标,剩余人数,计数 for (i=0;i<N;++i)//初始化 { str[i]=i+1; } count=N; mod=0; i=0; while(count>1) { if (str[i]!=0) { mod++; if(mod==M)//表示达到一个循环,此时应该淘汰此人,计数器清零 { str[i]=0; mod=0; count--; } if (i==N-1)//如果 下标为9表示最后一个人 下一个人就强制跳转到1 i=0; else i++;//否则 下标++ } else if(i==N-1)//如果下标为9是数组内容为0,则强制跳转到1 i=0;// else i++;//否则下标++ } for(i=0;i<N;++i) { if (str[i]!=0) { printf(" the winner is %d \n",str[i]); } }
约瑟夫问题重点:
1.计数,每数M个人 就要淘汰一个人,所以要有一个计数器Mod
2.对于淘汰的人,要将数组的值赋为零,并且在下次报数经过时,直接跳过数组内容为0的数组
3.实现数组的循环访问,一种方法是通过取余,另一种方法强制在数组尾部,使数组下标重新回到头部
最好的方法应该是链表实现的 ,等学到那一部分,再进行实现。
相关文章推荐
- C语言实现:约瑟夫问题(数组和单链表2种方法)
- 用单链表解决约瑟夫问题 C语言实现
- 约瑟夫问题(数组实现)
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- 循环链表范例(约瑟夫问题) 数组实现
- 约瑟夫问题,“遍历”思想.(C语言实现)
- 约瑟夫问题的数组实现
- 最大子数组问题及C语言实现
- 算法导论之最大子数组问题 C语言实现
- 约瑟夫问题(丢手帕问题)的数组实现
- 约瑟夫问题---数组实现
- C语言,数组实现约瑟夫环问题(两种方法)
- 约瑟夫问题 算法很简单保证每个人都能看懂用的是模拟现实 用数组实现 利用循环删除数组中的元素
- 11 C语言实现约瑟夫问题
- 约瑟夫循环c语言实现 (<<数据结构与算法>>-王曙燕 约瑟夫环问题解答)
- 一个关于去除数组重复元素的问题(C语言实现)
- 数组实现的约瑟夫问题(Java)
- 用C语言如何编程实现从三个数组中各抽取几个数进行组合的问题?
- 约瑟夫问题的数学角度分析 C 数组实现 循环链表实现 递归实现时间复杂度O(logN)
- 关于约瑟夫_Joesphus问题(C语言数组解决)