Lesson-10.md
December 7, 2012 · View on GitHub
Lesson 10 Josephus ring 约瑟夫环
#include <stdio.h>
#define ALL_NUM 100
#define COUNT_NUM 3
#define OUT_NUM 3
/* people id array such as (1,2,3,4,5,6) */
int people[ALL_NUM];
int main(void)
{
int left; /* left people number */
int pos; /* which pos */
int step; /* which step */
int i;
int counter = 0;
left = ALL_NUM;
pos = 0;
step = 0;
/* init id as 1,2,3,4,5,6 */
for (i = 0; i < ALL_NUM; i++)
people[i] = i + 1;
/* if there is still people in queue */
while (left > 0)
{
/* pos++? step++? left--? */
if (people[pos] > 0)
step++;
if (step == OUT_NUM && people[pos] != 0)
{
printf("%d out \n", people[pos]);
people[pos] = 0;
left--;
}
#if 1
pos = ++pos % ALL_NUM;
step = step % COUNT_NUM;
#else
pos++;
if (pos == ALL_NUM)
pos = 0;
if (step == COUNT_NUM)
step = 0;
#endif
}
return 0;
}
语法知识点
- 函数设计 function
- 数据驱动编程
课堂讨论
- pos 和 step 变量,每次赋值用 if 和 直接赋值,在执行效率有什么不同?
- 在这个算法实现中,留在环里面的人越少,无效的比较次数越多,有什么办法可以优化算法?
- 如何使用数组实现在课堂讨论中想到的优化算法。
课后练习
- 增加一个变量,用来统计在以上算法执行过程中比较的次数。
- 已知2012年1月1日是星期日,请打印出全年的月历。要求用到函数,数组和循环。
- 用户输入10个数字,对它们进行排序,要求把所有奇数排前面,所有偶数排后面。
名人名言
- Rob Pike (Go语言之父,和Ken Thompson一起设计了UTF-8编码格式,现Google首席工程师。)
- “Data dominates. If you’ve chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming.”
- “数据压倒一切。如果已经选择了正确的数据结构并且把一切都组织得井井有条,正确的算法也就不言自明。编程的核心是数据结构,而不是算法。”
- “给我看流程图而不让我看(数据)表,我仍会茫然不解;如果给我看(数据)表,通常就不需要流程图了;数据表足够说明问题了。”