记得上大学时第一个编程语言是BASIC,当时Visual Basic还没出世,QBASIC虽然已经在1991年随MS-DOS5.0推出了,但我们使用的还是 GW-BASIC, 使用的教材是谭浩强、田淑清编著的《BASIC语言》。

有一次的作业是判断一个数是否能被另一个数整除。
当时对BASIC的取模运算(运算符是MOD)不是很熟悉,但BASIC有 除法运算(运算符是 /)和整除运算(运算符是 \),于是我就编写了下面的代码:
- input " Please enter two integer: " ; a, b
- if a/b = a\b then
- print a;" is divisible by ";b
- else
- print a;" isn't divisible by ";b
记得程序运行时的输出结果是正确的。
关于GW-BASIC语言名称里的“GW”的含义,有几种说法。Greg Whitten是微软早期的一名员工,他说,比尔·盖茨选择了GW-BASIC这个名字。Whitten将其称为Gee-Whiz BASIC,并不确定盖茨是否以他的名字命名了该程序。Microsoft Press的Microsoft用户手册也使用此名称来指代它。它也可能被昵称为Gee-Whiz,因为它有大量的图形命令。其它说法还有“图形和视窗”(graph and windows)、“盖茨-威廉”(微软当时的总裁)或“盖茨-惠顿”(该程序的两个主要设计者)。
约瑟夫环问题的具体描述是:设有编号为1,2,……,n的n个(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,才从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,知道剩余1个人为止。当任意给定n和m后,设计算法求n个人出圈的次序。
这是《数据结构》课程里的经典问题了。使用数组来实现的话,最快的是使用取余算法得出圈的数组元素下标。不过我当时写的代码是真是一个个数了……
- #include
- #include
- int main()
- {
- int m = 3;
- int n = 7;//数组长度
- int a[7] = {1,2,3,4,5,6,7};
- int i = 0;
- int j;
- int k;
-
- printf("出圈顺序为:");
-
- while (n > 1)
- {
- //数数
- for (k=0; k < m; k++)
- {
- if (i == n)
- {
- i = 0;
- }
- else
- {
- i++;
- }
- }
-
- //输出出列的数字
- printf("%d ",a[i]);
-
- //数组元素前移
- for (j = i+1; j < n; j++)
- {
- a[j-1] = a[j];
- }
-
- n--; //数组长度-1
-
- if (i == n)
- {
- i = 0;
- }
- }
-
- //输出出列的数字
- printf("%d ",a[i]);
-
- return 0;
- }