c语言经典递归法算法的疑问:(必须用递归算法做出来哦) 题目请看问题补充

2025-01-03 17:15:14
推荐回答(1个)
回答1:

#include

int jos(int n, int k); // n表示总共有多少人, k表示报数的第几个数退出

int main(void)
{
int n,k,s;
printf("请输入总人数和间隔数(中间以空格隔开)\n");
scanf("%d %d", &n, &k);
s = jos(n, k);
printf("获胜者是:%d\n", s);

return 0;
}

int jos(int n,int k)
{// 每次运行都返回当前淘汰出来的位置
int x;
if(n==1) // 当剩下最后一个的时候他就是获胜者
x=1;
else
{// 如果多余一个
x=(jos(n-1,k)+k)%n; // 继续从剩余的这些人中进行选取获胜(%n达到了循环的目的)(这里利用n-1时的淘汰位置加上k是下一个淘汰位置, 此时n又被减少)
if(x==0)
x=n;
}

return x;
}

/*
请输入总人数和间隔数(中间以空格隔开)
37 5
获胜者是:1
Press any key to continue
*/