C语言编程,编号1,2,3……,n的人循环报数,报数为m的出列,下一位接着又从1开始报数,输出最后一个编号

我自己写的程序,不知道问题在哪,运行验证时,对应某些n,m值,得到的是对的,有些又是错的,急求指导,我的编程软件调试的时候总是出问题,急求指导,我想把程序写简单点
#include<stdio.h>
void main()
{
int num[50],n,m,i;
int x=0,y=0;

printf("总数,报数\n");
scanf("%d,%d",&n,&m);

for(i=0;i<=n;i++)
{

if(i==n)//编号为n+1个人报数时,因为只有n个人,所以重新由第一个人报数

{i=0;}//i=0,相当于第一个人开始报数

num[i]=i+1;//编号1,2,3,……,n

if((n-y)==1) //如果只剩1个人未报数,即为最后一个出列的人

{
printf("%d",i+1);//输出最后一个出列人的编号

break;//跳出循环
}

if(num[i]!=0)//编号不为0的报数

{ x++;}//x控制报的数

if(x==m)//报数为m时
{
x=0;//报数归零,实现循环报数

num[i]=0;//编号变为0,这样处理相当出列,编号为0的不参与报数

y++;//出列人数+1

}

}

}

指出一个显而易见的错误。为num数组 赋编号怎么可以和其他判断放在一起呢
PLUS:
以下为我用Java 在你的基础上修改的,你本身程序思路是对的,加星号×的是有修改过的地方,特别注意最后一段代码,仔细想想吧,就不告诉你为什么了。语法和c差不对你应该能懂得哈

public class rerere {
/**
* @param args
*/
public static void main(String[] args) {

int[]num=new int[50];int n=7,m=3;
int x=0,y=0;
int i;

//*************************先赋值
for(int j=0;j<n;j++)
{
num[j]=j+1;
}
//*************************
for( i=0;i<=n;i++)
{
if(i==n)//编号为n+1个人报数时,因为只有n个人,所以重新由第一个人报数
{
i=0;//i=0,相当于第一个人开始报数
}
if(num[i]!=0)//编号不为0的报数
{
x++;//x控制报的数
}
if(x==m)//报数为m时
{
x=0;//报数归零,实现循环报数
System.out.println(num[i]+"变为0");//××××××××××××方便查看
num[i]=0;//编号变为0,这样处理相当出列,编号为0的不参与报数

y++;//出列人数+1
}

//××××××××××××××××××××××××××××××××××这时候不能简单的以为i+1就是最后剩下的那位,慢慢理解
if((n-y)==1) //如果只剩1个人未报数,即为最后一个出列的人
{
//printf("%d",i+1);//输出最后一个出列人的编号
for(int ii=0;ii<n;ii++)
{
if(num[ii]!=0)
{
System.out.println(num[ii]);break;//跳出循环
}
}
}
if((n-y)==1)//××××××××××××××××××××跳出最外层循环
break;
//×××××××××××××××××××××××××××××××××××××××××××
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-17
其实结果就是n%m(模运算)也就是n/m的余数
如果求余结果为0 那么最后一个认得编号是m追问

能看看我的程序吗?

第2个回答  推荐于2016-08-27

/*

总数 报数

8 4

4 8 5 2 1 3 7 6

Press any key to continue

*/

#include<stdio.h>
void main() {
int num[50],n,m,i,j;
int len,start = 0,counter = 1;
printf("总数 报数\n");
scanf("%d%d",&n,&m);
if(n < 0 || n > 50 ) n = 50;
if(m < 1 || m > n) m = n/2;
for(i = 0; i < n; ++i) num[i] = i + 1; // 预填
len = n; // len保留队列中现有人数
while(len) {
if(counter == m) {
printf("%d ",num[start]);
for(j = start; j < len - 1; ++j)
num[j] = num[j + 1];
--len;
counter = 1;
}
else {
++counter;
++start;
start %= len;
}
}
printf("\n");
}

追问

能看看我的程序吗?

追答

我仔细看了你的代码,算法上不合理,所以改动很大。这是用数组做的,我还有链表做的约瑟夫报数代码,看上去要复杂多了。

本回答被提问者采纳

C语言编程,编号1,2,3……,n的人循环报数,报数为m的出列,下一位接着又...
public static void main(String[] args) { int[]num=new int[50];int n=7,m=3;int x=0,y=0;int i;\/\/***先赋值 for(int j=0;j<n;j++){ num[j]=j+1;} \/\/ for( i=0;i<=n;i++){ if(i==n)\/\/编号为n+1个人报数时,因为只有n个人,所以重新由第一个人报数 { i=...

用C语言解决一个实际问题(不要太长)
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。void JOSEPHUS(int n,int k,int m) \/\/n为总人数,k为第一个开始报数的人,m为...

C语言:n个编号为1~n的人围坐一圈,从1号开始正向报数到m者退出,从下一...
int main(int argc,char *argv[]){ int a[20],b[20],i,j,t,n,m;printf("Enter n(int 0<n,m<21)...\\nn m = ");if(scanf("%d%d",&n,&m)==2 && n>0 && n<21 && m>0 && m<21){ for(i=0;i<n;a[i++]=i+1);\/\/创建人员编号 i=-1,j=t=0;printf("\\nTh...

...喊到一个数就出局,最后剩下的人,用c语言用动态链表编程
假设有n个人参加报数,依次编号1~n。从编号1开始依次报数,从1报到m,报到m的人出列,剩下来的人重新开始报数,报到m的人出列,如此重复直到所有人都出列为止。最后出列的人原来的编号是多少?链表程序如下:include <stdio.h>#include<stdlib.h>struct node{int num;struct node *next;};struct ...

...从第一个人开始报数(从1到3报 数),凡报到3的人退出圈子,
if(*p==0){\/\/如果健在 if(out_n==(N-1))break;\/\/如果仅剩一人 call_n++;\/\/报数 call_n%=3;\/\/最大为3,到了3就从0开始 if(call_n==0){*p=1;out_n++;}\/\/为0(即3)出局 } p++;if(p==a+N)p=a;\/\/循环转向下一人 } printf("最后剩余者的编号是:%d\\n",p+1-a);} ...

c语言编写n个人围成一圈,按1、2、3报数,报到3的人退出,求最后留在圈...
设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。假设除去第k个人,则 0, 1, 2, ...

...从第一个人开始报数(从1到3报数),凡报到3的人退出 。。。
这个问题叫约瑟夫环问题。n个人围成一圈,按顺序编号,分别为1、2、3..n。(你可以理解成每个人的座号)。然后1号开始,每人依次报号。即 (这里假设n=5)(前面是座号、后面是他报的号)1:1 2:2 3:3(退出)现在只剩下座号为1、2、4、5的人,从3的下一个开始报号 4:1 5:2 1:3...

约瑟夫问题的两种解法
【约瑟夫问题】编号为1,2,...,n的n个人按照顺时针方向围坐一圈。从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。其中n,m由键盘输入。【思路1】利用数组存放n...

C语言出错重新位
int main(){ int ln,x,t,s,k,i,n,m,p;static int a[200];printf("编号1,2,...,n的n个人逆时针依次围成一圈,从1开始,\\n");printf("逆时针1,2,3,..报数,凡m的倍数者出圈.\\n");printf("求最后一个未出列者与第p个出列者的编号.\\n");printf("请依次输入n,m,p:");sca...

学C语言的NOIP问题
SQL Server C. Oracle D. 金山影霸 E. Foxpro 12. 下列哪个程序设计语言不支持面向对象程序设计方法( )。 A. C++ B. Object Pascal C. C D. Smalltalk E. Java 13. 由3个a,1个b和2个c构成的所有字符串中,包含子串“abc”的共有( )个。 A. 20 B. 8 C. 16 D. 12 E. 24 14. 某个车站...

相似回答