幸运人士-

这篇博客探讨了一种在大型派对中选取幸运人士的方法,通过递归剔除奇数位置的参与者。文章提供了一个C语言实现的递归算法,该算法根据输入的人数n,计算出最后剩下的那个人在原序列中的位置。对于输入1、2、3,输出分别是1、2、2。此问题涉及到计算机科学中的递归和数组操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

一次大型派对的最后节目是选出一位幸运人士,该人士将获得派对组织者准备的一个钻石戒指。 
而选择幸运人士的办法是让所有人员一字排列,然后从左至右点数,凡是奇数号的全部剔除。 
对于剩下的人员,又从左至右点数,逢奇数号就剔除。 
如此不断递归下去,直到只剩下一个人为止,此人即为幸运之人。 
请设计一个递归算法计算幸运之人所在的位置。 

输入

多组数据,每组输入一个正整数n。

输出

输出最后剩下的那个人的位置。

样例输入 Copy

1
2
3

样例输出 Copy

1
2
2
#include <stdio.h>
#include <stdlib.h>
 
int f(int a[],int n){
        int i,temp=0;
    int a1[100];
     if(n==1){
        return a[1];//只有一个人的情况
     }else if(n>1){
         for( i=1;i<=n;i++){//将位置为偶数的记录在另一个数组中,进行下一轮剔除
            if(i%2==0){
                temp++;
                a1[temp]=a[i];
             }
         }
         return f(a1,temp);//递归
     }
}
int main(){
    int i;
    int a[100];
    int j;
    while(~scanf("%d",&i)){
        for(j=1;j<i+1;j++){
                a[j]=j;//记录每个人的位置编号
        }
    printf("%d\n",f(a,i));
    }
     
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值