【数据结构】数组标志位实现约瑟夫环问题

/*方法二:数组标志位实现方式*/

#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
即是:
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()简析

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值