/*方法二:数组标志位实现方式*/
#include <stdio.h>
int main() {
int n, m; //n为猴子个数,报数到m退出
int number;//记录剩余的猴子个数
int count = 1;//count代表当前的报数
int i, pos;
int ans[301], answer = 0;
while (~scanf("%d %d", &n, &m)) {
if (0 == n || 0 == m)
break; //return 0不可以
number = n;
//monkey数组存储猴子的编号和状态;
//数组的值为-1代表无效数组,0代表退出的猴子,1到n+1代表还未退出的猴子
int monkey[301] = {0}; //monkey数组的301个元素都赋值为0
for (i = 0; i < n; ++i)
monkey[i] = i + 1;
pos = 0;//pos控制当前处理的数组下标
while (number > 1) {
if (monkey[pos] > 0) {
if (count != m) {
count++; //报数+1
pos = (pos + 1) % n;
} else {
monkey[pos] = 0;
count = 1; //报数重新开始
number--; //猴子个数-1
pos = (pos + 1) % n; //当前处理的数组下标+1
}
} else {
pos = (pos + 1) % n;
}
}
for (i = 0; i < n; i++) {
if (monkey[i] > 0)
//printf("%d\n",monkey[i]);//即时输出结果
{ ans[answer++] = monkey[i]; }
//我真是服了,就是没给这条语句加{},我找了好久的错。
}
}
for (i = 0; i < answer; ++i) {
printf("%d\n", ans[i]);
}
return 0;
}
1.
**if (0 == n || 0 == m)
break;
这里换成return 0不可以。
**
2.
if (monkey[i] > 0)
//printf("%d\n",monkey[i]);//输出结果
{ ans[answer++] = monkey[i]; }
**if后即使只有注释和一条语句,不加 { } 也不可以!
就是这个错误我找了好久好久!
即使前面有注释,也不能省略{ }!(这句话是错的,我后面解释了)
以后养成习惯,无论是一条语句还是多条语句,都要加{ }!
**
3.
ans[answer++] = monkey[i];
这里answer为什么要++呢?
a[i++]=a
即是:
a[i] = a;
i ++;
先把a赋值给数组a下标为 i 的 元素
把 i 自加 1 ;即指向下一个元素。
原来是这个样子!这也就解释了前面为什么if后只有一条语句
但是没加{ };程序也运行不成功了!因为它是两条语句!!
和注释没关系!养成习惯——if后一定要加{ }!
4.
~scanf这是什么意思?
~是位运算,它是将数据在内存中的每一位(当然是二进制)取反。
正常输入的时候,scanf返回接收到的变量值的个数,如1,2,3等等。对这些数字取非,不会成为0,就会执行循环;
错误输入时,scanf返回的是EOF(End Of File),EOF=-1,对EOF取非,就是对-1取非(0),这时跳出循环。
可参考下面这篇文章。
~scanf()简析