DOTCPP:问题1047心得

本文详细解析了一个经典的约瑟夫环问题,通过使用数组而非链表的方式,提供了一种新颖的解决方案。文章中,作者逐步阐述了如何通过修改数组元素来模拟报数过程,并最终确定圈中最后留下的个体的初始编号。

题目描述

有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入初始人数n
输出最后一人的初始编号

思路

我一开始想用链表解决这个问题,但是由于我还没开始复习数据结构,所以就搁置了。
但是这个题用数组依然可以解。链表的解决方式以后有时间再更。

  • 初始化的时候数组的下标和对应的元素相等,如果直接删除数组元素可能会导致数组一些元素下标和对应的值不相等,所以对于需要删除的值,我选择将其值改为-1
  • n个人围成一个圈,所以每排到一个人,他对应的下标就是之前的下标加一取模(n)
  • 被排到的人有三种情况
    1、下标对应的值不是-1即不是需要退出的值,且上一报数值加一取模(3),不为0,则现有的人数temp不需要变化(temp初始化为n)
    2、下标对应的值不是-1即不是需要退出的值,且上一报数值加一取模(3),为0,则其下标对应的值更新为-1,现有的人数temp减一
    3、下标对应的值是-1即是需要退出的值,则继续循环temp不变

代码

#include <stdio.h>
#include <malloc.h>
int main()
{
    int n, i, index, num, temp;
    scanf("%d", &n); 
    int *a = (int *) malloc(n * sizeof(int));
    for(i = 0; i < n; i++)
    {
     a[i] = i;
 }
 index = 0;
 num = 0;
 temp = n;
 while(temp > 1)
 {
  index = (index + 1) % n;
  if(a[index] != -1)
  {
   num = (num + 1) % 3;
   if(num != 0)
   {
    continue;
   }
   else
   {
    a[index] = -1;
    temp--;
   }
  }
  else
  {
   continue;
  }
 }
 for(i = 0; i < n; i++)
 {
  if(a[i] != -1)
   printf("%d", i);
 }
    return(0);
}

小贴士

面对比较复杂的编程,先写出算法会更方便。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值