首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有关 报数出圈 的有关问题

2012-02-13 
有关 报数出圈 的问题报数出圈:设有n个人围坐一圈并按顺时针方向从1到i编号,从第j个人开始进行1到num的报

有关 报数出圈 的问题
报数出圈:
设有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;
}

热点排行