有n个人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

qq_23366035 2015-10-12 09:38:01
这是我写的 请问下是哪里出问题了?感激不尽!!!!!
#include<stdio.h>
int main()
{
int j,k=21,x=0,a[20]={1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2},*p[20],n,i;
printf("请输入n:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
p[i]=a+i;
while(k>2)
{
for(i=n-1;;)
{
if(*p[i]==0) i--;
else if(*p[i]==3)
{j=0;break;}
else if(*p[i]==2)
{j=2;break;}
else if(*p[i]==1)
{j=1;break;}
}
for(i=0;i<n;i++)
if(*p[i]==3) p[i]=&x;
for(i=0;i<n;i++)
if(*p[i]!=0)
{
p[i]=a+j;
j++;
}
for(i=0,k=0;i<n;i++)
if(*p[i]!=0) k++;
}
for(i=0;i<n;i++)
if(*p[i]==1) break;
printf("第%d号留下来了.",i+1);
return 0;
}
...全文
3524 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2015-10-19
  • 打赏
  • 举报
回复
约瑟夫环 用循环链表易于理解,易于找错
yu.sang 2015-10-18
  • 打赏
  • 举报
回复
楼主,且不说你的问题出在哪里,就看您提问的方式。 1.直接上代码,问出什么问题,起码要有自己的一些分析过程,出问题的点在哪里。。等。 2.代码乱七八糟,连个缩进格式都没有。这样大家都没心情帮你调试了。 你看看回复你的两位高手的代码格式。
tzxx 2015-10-17
  • 打赏
  • 举报
回复
N年前面试时遇到过这个题,当时答错了,面试官跟我说用循环链表比较好做。
橘风之轮 2015-10-17
  • 打赏
  • 举报
回复
使用循环列表,这个问题就比较简单了
未来在脚下 2015-10-17
  • 打赏
  • 举报
回复
其实这道题最好的是用循环链表,这个时候考虑数据的组织比较好
qq_23366035 2015-10-17
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
仅供参考:
//假设有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();
}
我已经有答案了,但是我不知道我写的错在哪里了,您能帮我看一下吗?谢谢!
赵4老师 2015-10-12
  • 打赏
  • 举报
回复
仅供参考:
//假设有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();
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧