约瑟夫问题C语言

#include<stdio.h>

int main()
{
    int All[50] = { 0 };//存活的人下标对应的值为零
    int all, alive, deathnum, counter, order;//原有总人数,存活人数,计数器(报数),死亡序号
    int i;

    scanf("%d %d", &all, &deathnum);
    printf("总共有%d人\n每报数到%d的人自杀\n", all, deathnum);
    alive = all;

    //按照人物编号进行遍历(i+1即为人物编号)
    for (i = 0, counter = 1, order = 0; alive >= deathnum; counter++, i++)
    {
        i %= all;//保证i的范围在 0 到 总人数-1 之间
        while (All[i] != 0)//如果i号已经自杀,则跳过i号判断i+1号
        {
            i++;
            i %= all;
        }
        if (counter % deathnum == 0)//如果报数到3
        {
            order += 1;//死亡人数(序号)+1
            All[i] = order;//自杀的人下标对应的值为死亡序号
            alive--;//存货人数-1
            //按死亡顺序输出自杀者
            printf("第%d个自杀的是%d号\n", order, i + 1);
        }
    }
    printf("\n");
    
    //按编号顺序输出自杀者
    for (i = 0; i < all; i++)
    {
        if(All[i]!=0)
            printf("%d号是第%d个自杀的\n", i + 1, All[i]);
    }
    printf("\n");
    
    //输出存活者
    for (i = 0; i < all; i++)
    {
        if (All[i] == 0)
            printf("%d号存活下来了\n", i + 1);
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值