#include<stdio.h>
int main()
{
int i, j = 1;
int arr[13] = {0};
for(i = 1; i <= 13; i++)
{
int n = 1;
while(n <= i)
{
if(j > 13)
{
j = 1;
}
if(arr[j])
{
j++;
}
else
{
if(n == i)
{
arr[j] = i;
}
n++;
j++;
}
}
}
return 0;
}
这个问题的处理方法有不少种,这里就介绍了最基础的C语言解法,在咱们学过了数据结构后就能够利用循环链表和循环队来处理,相对好理解一点。web
经过上面的问题,咱们还能过解决另一个问题:有N我的围成一圈,并将它们编号从1–N,而后开始报数,规定每隔M我的就淘汰一我的,问最后剩下的人为原先的几号?数组
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
int m, n;
printf("请输入人数N:");
scanf_s("%d", &n);
printf("请输入相隔M:");
scanf_s("%d", &m);
int *arr = (int *)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
{
arr[i] = i + 1;
}
int count = n;
int k = 0, j = 0;
while (count > 1)
{
if (arr[k] != 0)
{
j++;
}
if (j == m + 1)
{
arr[k] = 0;
j = 0;
count--;
}
k++;
if (k == n)
{
k = 0;
}
}
for (int i = 0; i < n; i++)
{
if (arr[i] != 0)
{
printf("最后剩下的号码为:%d\n", arr[i]);
}
}
free(arr);
}