PTA 7-2 猴子选大王

该问题描述了一种选择猴王的算法,即猴子围圈报数,报到3的倍数的猴子退出,最后剩下的一只为猴王。这是一个典型的约瑟夫环问题,可以通过编程实现,例如使用数组来模拟过程,当数值为3的倍数时将该位置设为0,最后找到数组中唯一的非零值,其对应的就是猴王的原始编号。代码示例给出了C语言的解决方案,利用递归或其他数据结构也可以解决此类问题。
摘要由CSDN通过智能技术生成

题目

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(≤1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

思路

用数组的下标表示猴子的编号,数组的元素表示猴子报数的次序(eg:第N次报数元素值为N);

退出的猴子对应的元素值改为0;

剩一只猴子时停止报数;

遍历数组输出唯一不为零元素对应的下标。

代码

#include<stdio.h>
#define M 3        //报到M的猴子退出圈子
int main()
{
    int N, i, k, count, index;
    
    scanf("%d",&N); //总人数N 
    int a[N+1];    
    count = N;        //剩余的人数 
    k = 0;            //在N之后接着数 
    
    a[0] = 0;
    for(i = 1; i<N+1; i++)a[i] = i;    //从1开始用数组下标与标号一一对应 
    
    i = 1;
    do{
        for(i = 1; i<N+1; i++){
            
            if(a[i] != 0 && a[i]%M==0){
                a[i] = 0;                    //是3的倍数的变成零,相当于删除了
                count--;                    //剩余个数减一 
            }else if(a[i] != 0 && a[i]%M!=0){
                k++;
                a[i] =N + k;        //在N之后接着数 
            }
            
        }
        
    }while(count >1);                //只剩一个数时循环结束 
    
    for(i = 1; i<N+1; i++){
        if(a[i] != 0){
            index = i;                //最后一个非零数的下标 
            printf("%d",index);
        }
    }
    
    return 0;
}

总结

这属于约瑟夫环问题。

使用数组,链表,递归皆可完成。

递归:http://t.csdn.cn/UPTFN

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值