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