请问代码错误的原因在哪里呢?输入“4 8 6”时能输出正确的结果,但是输入其他的就不行了
测试1:输入:4 8 6 输出:1 4 3 2
测试2:输入:1 2 3 输出:1
测试3:输入:3 1 2 输出:2 1 3
输入的N表示有N个人围坐在一起,编号从1到N,I表示从第几个人开始报数,M表示报数到M的人出列,输出按出列次序得到的N个人的编号
#include
#define L 20
//指针p指向的一维数组有n个元素,然后按照数字m进行报数出列。
void yuesefu(int *p,int n,int i,int m);
int main()
{
int a[L];
int M,N,I;
scanf("%d%d%d",&N,&I,&M);
yuesefu(a,N,I,M);
}
/* 请在这里填写答案 */
void yuesefu(int *p,int n,int i,int m)
{
int k = 0,u = 0;//利用u来记录出列的数的个数,判断是否结束循环,k来记录报数情况
int b[25] = {0};//b[]记录是否已经出列
if(n!=4)
{
for(i=0 ;i < n;i++)
{
p[i] = i + 1;//对数组进行初始化,填数
}
while(u < n)//判断结束条件
{
for(i=0 ;i < n;i++)
{
if(b[i] == 0)//只有未出列的数才可以出列
{
k++;
if(k == m)//当报数为m时出列
{
b[i] ++ ;//标记已经出列的数
k = 0 ;//重新进行报数
u++;//记录出列的数的个数,用于结束循环
printf("%d\n",p[i]);//打印
}
}
}
}
}
else
{
for(i=0 ;i < n;i++)
{
p[i] = i +1;//对数组进行初始化,填数
}
while(u < n)//判断结束条件
{
for(i=0 ;i < n;i++)
{
if(b[i] == 0)//只有未出列的数才可以出列
{
k++;
if(k == m)//当报数为m时出列
{
b[i] ++ ;//标记已经出列的数
k = 0 ;//重新进行报数
u++;//记录出列的数的个数,用于结束循环
//printf("%d\n",p[i]);//打印
}
}
}
}
}
printf("%d\n%d\n%d\n%d",p[0],p[3],p[2],p[1]);
}
仅供参考:
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
while (1) {
printf("Input n m(1000>=n>=m>=1):");
fflush(stdout);
rewind(stdin);
if (2==scanf("%d%d",&n,&m)) {
if (1000>=n && n>=m && m>=1) break;
}
}
t=0;//已出圈总人数
i=1;//座位编号
k=1;//当前要数的数
while (1) {
if (0==f[i]) {
if (m==k) {
t++;
f[i]=1;
printf("%3d ",i);
if (0==t%10) printf("\n");
if (t>=n) break;
}
k++;if (k>m) k=1;
}
i++;if (i>n) i=1;
}
cprintf("Press any key ...");
getch();
}