每日编程中遇到任何疑问、意见、建议请公众号留言或加入每日编程群聊739635399
n个小朋友轮流数数,每次+1,mod k为零时该名小朋友失败,问最后谁赢?
输入格式:
输入小朋友的个数n和被除数k。
输出格式:
输出最后一名出局的小朋友的序号。输入样例:
5
2
输出样例:
3
解决方法:
(1)算法的基本思想:
建立两个数组,先将所有小朋友的序号存入第一个数组,第一轮数完之后,将剩下的序号放入第二个数组,开始第二轮,第二轮结束后将剩下的序号放入第一组,依次循环,直至剩下最后一名小朋友。
(2)代码实现:
#include <stdio.h>
int main()
{
printf("请输入人数:\n");
int n;
scanf("%d", &n);
printf("请输入被除数:\n");
int k;
scanf("%d", &k);
printf("\n");
int a[n], b[n];
int i = 0, j = 0, flag = 0, shengyu = n, yushu = 0, s = 0;
for (i = 0; i < n; ++i)
{
a[i] = i + 1;
}
while (shengyu > 0)
{
i = 0;
j = 0;
s = 0;
if (flag == 0)
{
while (i < shengyu)
{
if ((yushu + 1 + i) % k != 0)
{
b[j] = a[i];
++j;
}
else
{
printf("%d\n", a[i]);
s = s + 1;
}
++i;
}
yushu = shengyu % k + yushu;
shengyu = shengyu - s;
flag = 1;
}
else if (flag == 1)
{
while (i < shengyu)
{
if ((yushu + 1 + i) % k != 0)
{
a[j] = b[i];
++j;
}
else
{
printf("%d\n", b[i]);
s = s + 1;
}
++i;
}
yushu = shengyu % k + yushu;
shengyu = shengyu - s;
flag = 0;
}
}
printf("\n最后一个小朋友是:%d", b[i - 1]);
return 0;
}
将一个长度为10的数列最大值放第一个,最小值放最后一个。
输入样例:
1 2 3 4 5 9 0 7 8 6
输出样例:
9 2 3 4 5 1 6 7 8 0