有关 报数出圈 的问题
报数出圈:
设有n个人围坐一圈并按顺时针方向从1到i编号,从第j个人开始进行1到num的报数,报数到第num个人,此人出圈,再从他的下一个人
重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。
可设 i = 10, j = 1,num = 7。
(1) 将1到n个人的序号存入一维数组a[]中;
(2) 若第j个人报数后出圈,则将a[j]置于数组的第一个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置;
(3) 重复第(2)步直至圈中只剩下a[1]为止。
最终在显示器上输出依次出圈的人的编号
我写个程序,开始到后面老是会出错,谁能帮我看系啊啊
#include <stdio.h>
int main(void)
{
int a[50] = {0};
int i = 8; //参加人数
int j = 1;
int k = 0; int h;
int num =5; //输入剔除的人数间隔
//scanf( "%d ",&num);
//scanf( "%d ",&i);
for (j=1;j <=i;j++)
{
a[j]=j;
}//初始化数组
j=0;
//for (j=1;j <=i;j++)
do
{
j++;
if(j==i)
{
j=1;
}
k+=1;
if(k==num)
{
a[0]=a[j];
h=j;
do
{
a[h] = a[h+1];
h += 1;
}while( h <i );
k=2;//删除后K前移,继续计算
i-=1;//删除了数后数组缩小
printf( "%d\n ",a[0]);
}
}while(i!=1);
return 0;
}
[解决办法]
从别的地方copy的
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* arr; /* 用于存储“那些人” */
int n; /* “那些人”的总数 */
int s; /* 开始的编号 */
int m; /* 间隔多少个人出列一个 */
int i,j;
printf( "请输入多少个人:\n ");
scanf( "%d ",&n);
printf( "请输入开始的序号:\n ");
scanf( "%d ",&s);
printf( "请输入间隔的人数:\n ");
scanf( "%d ",&m);
arr = (int*)(malloc(sizeof(int) * n)); /* 申请一个数组,以存储“那些人” */
if (arr == NULL) /* 并非一定分配成功的 */
{
printf( "空间不足,程序退出。\n ");
return 1;
}
for (i = 0;i < n;i++)
{
arr[i] = i + 1; /* 填空数组,编号是下标加一,注意C语言中的数组下标从0开始 */
}
printf( "出列顺序:\n ");
j = s + m - 2; /* 这是第一个要出列的人的下标 */
while (n > 1) /* 当队列中还有不止一个人的时候,要就进行出列的动作 */
{
printf( "%d\n ",arr[j]); /* 把这个家伙打印出来 */
/* 这个家伙走了以后,后面的人应该依次顶上来 */
for (i = j;i < n - 1;i++)
{
arr[i] = arr[i + 1];
}
n--; /* 并且整个队列的人少了一个,也就是长度要减掉一 */
/* 这是下一个要出列的人 */
j = (j + m - 1) % n;
}
/* 现在只有一个人了,就是arr[0] */
printf( "最后一个是:%d\n ",arr[0]);
free(arr); /* 记得要释放申请的空间 */
return 0;
}
[解决办法]
改了一下你的代码:
#include <stdio.h>
int main(void)
{
int a[50] = {0};
int i = 8;
int j = 1;
int k = 0; int h;
int num =5;
for (j=1;j <=i;j++)
{
a[j-1]=j;
}
j=0;
do
{
if(j==i)
{
j=0;
}
k++;
if(k==num)
{
h = j;
printf( "%d\n ",a[h]);
while( h <i )
{
a[h] = a[h+1];
h++;
}
k=0;//重新计算
i--;
continue;
}
j++;
}while(i> 0);
return 0;
}