| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 32877 人关注过本帖, 1 人收藏
标题:n个人围成一圈报数,从1开始,凡报到3的退出,问留到最后的是几号?
只看楼主 加入收藏
我叫小白
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-12-16
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:13 
n个人围成一圈报数,从1开始,凡报到3的退出,问留到最后的是几号?
刚学指针,老师布置的题目。
程序代码:
/*
*报数为3的同学离开,计算最后剩下那个同学
*/
#include<stdio.h>
void input(int[1000],int);
int wipe(int[1000],int);
int main()
{
    int n,num[1000],r;
    printf("请输入有几位同学:");
    scanf("%d",&n);
    //为每位同学分配号数
    input(num,n);
    //游戏开始
    r=wipe(num,n);
    //输入最后胜者
    printf("剩下的同学号数为: %d\n",r);
    return 0;
}
//把同学分成1-n号
void input(int *p_num,int n)
{
    int i;
    for(i=0;i<n;i++)
        *(p_num+i)=i+1;
}
//游戏开始,k为出局人数,j为当前报数
int wipe(int*p_num,int n)
{
    int j=0,k=0;
    for(;;++j,p_num++)
    {   
          if(j==3)
          {
              k++;
              j=0;
          }
          *(p_num+n)=*(p_num+k);
          if(k==n-1)
          return *(p_num+n);                 
    }
}
自认为思路没错,但老得不到正确答案,求大神们纠正!!!
搜索更多相关主题的帖子: 个人 
2012-12-16 21:23
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:3 
程序代码:
int wipe(int*p_num,int n)
{
    int j=0,k=0;
    for(;;++j,p_num++)
    {  
          if(j==3)
          {
              k++;
              j=0;
          }
          *(p_num+n)=*(p_num+k); 
          if(k==n-1)
          return *(p_num+n);                
    }
}


这里有些逻辑错误,好好改改吧

I have not failed completely
2012-12-16 21:49
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:3 
/*
*报数为3的同学离开,计算最后剩下那个同学
*/
#include<stdio.h>
void input(int[1000],int);
int wipe(int[1000],int);
int main()
{
    int n,num[1000],r;
    printf("请输入有几位同学:");
    scanf("%d",&n);
    //为1-n号同学都标志在队
    input(num,n);
    //游戏过程
    r=wipe(num,n);
    //输入最后胜者
    printf("剩下的同学号数为: %d\n",r);
    return 0;
}
//把1-n号同学都标志在队
void input(int *p_num,int n)
{
    int i;
    for(i=0;i<n;i++)
        *(p_num+i)=1;
}
//游戏过程,k为出局人数,j为当前报数
int wipe(int*p_num,int n)
{
    int i,j=0,k=0;
    while(1)
    {
        for(i=0;i<n;i++)
        {
            j=j+*(p_num+i);
            if(j==3)
            {
                *(p_num+i)=0;
                k++;
                if(k==n-1)
                    goto loop;
                j=0;
            }
        }
    }
loop:   for(i=0;i<n;i++)
            printf("%d ",*(p_num+i));
        printf("\n");
        for(i=0;i<n;i++)
            if(*(p_num+i)==1)
                return i+1;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

小小战士,战士中的战斗机!
2012-12-17 10:58
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:3 
http://acm.tzc.
C语言实验题——约瑟夫问题  
时间限制(普通/Java):1000MS/10000MS     运行内存限制:65536KByte
总提交: 1770            测试通过: 1157
描述
n个人想玩残酷的死亡游戏,游戏规则如下:
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。请输出最后一个人的编号。
输入
输入n和m值。1<n,m<150。
输出
输出胜利者的编号。
样例输入
5 3
样例输出
4
提示
第一轮:3被杀
第二轮:1被杀
第三轮:5被杀
第四轮:2被杀

程序代码:
#include<stdio.h>
int main()
{   
    int a = 0,b = 0,c = 0,n = 0,sum = 1;
    int kill[150] = {0};
    int i = 0,j = 0,k = 1;
    scanf("%d %d",&a,&b);
    for(i = 1;i<=a;)
    {
        if(!kill[i])
        {
            if(sum == i)
                k++;
            else
            {
                k = 1;
                sum = i;
            }
            if(k==b)
            {
                printf("%d\n",i);
                break;
            }
            j++;
        }
        if(0 == j%b && !kill[i])
            kill[i] = true;
        i%=a;
        i++;
    }
    return 0;
}

                                         
===========深入<----------------->浅出============
2012-12-17 11:14
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:3 
瑟夫环。。。
论坛里有好多这个问题的帖子

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-17 11:25
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
/********************************************
 *猴子选大王:
 *n个猴子站圈,从1到n编号,从1到e循环报数,
 *报e的出局,其他猴子继续
 *最后一个猴子成为大王
 *问最后一个猴子是第几号?
 ********************************************
 *解题思路:
 *数组x[n]存放猴子个数和状态(1为在局,0为出局)
 *若x[i]为数到e,则x[i]=0标记出局,再n-1
 *直到n=1,输出对应i+1
 ********************************************/
#include<stdio.h>
int main()
{
    int i,j=0,n,e;
    printf("猴子的数量:");
    scanf("%d",&n);
    if(n!=1)
    {
        printf("从1数到");
        scanf("%d",&e);
    }
    int m=n;
    int x[n];
    for(i=0;i<n;i++)
    x[i]=1;
    while(n!=1)
    {
        for(i=0;i<m;i++)
        {
            j=j+x[i];
            if(j==e)
            {
                x[i]=0;
                j=0;
                n--;
            }
        }
    }
    for(i=0;i<m;i++)
    if(x[i]==1)    printf("猴子大王为第%d号猴子!\n",i+1);
    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

小小战士,战士中的战斗机!
2012-12-17 11:29
lantiantieyi
Rank: 1
等 级:新手上路
帖 子:9
专家分:5
注 册:2012-9-5
收藏
得分:3 
请问怎么样实现将推出顺序输出?
2012-12-17 17:26
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
/*
*报数为3的同学离开,计算最后剩下那个同学
*/
#include<stdio.h>
void input(int[1000],int);
int wipe(int[1000],int);
int main()
{
    int n,num[1000],r;
    printf("请输入有几位同学:");
    scanf("%d",&n);
    //为1-n号同学都标志在队
    input(num,n);
    //游戏过程
    r=wipe(num,n);
    //输入最后胜者
    printf("剩下 : %3d号同学\n",r);
    return 0;
}
//把1-n号同学都标志在队
void input(int *p_num,int n)
{
    int i;
    for(i=0;i<n;i++)
        *(p_num+i)=1;
}
//游戏过程,k为出局人数,j为当前报数
int wipe(int*p_num,int n)
{
    int i,j=0,k=0;
    while(1)
    {
        for(i=0;i<n;i++)
        {
            j=j+*(p_num+i);
            if(j==3)
            {
                printf("出局 : %3d号同学\n",i+1);
                *(p_num+i)=0;
                k++;
                if(k==n-1)
                    goto loop;
                j=0;
            }
        }
    }
loop:   for(i=0;i<n;i++)
            if(*(p_num+i)==1)
                return i+1;
}
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 小小战士 于 2012-12-17 17:48 编辑 ]

小小战士,战士中的战斗机!
2012-12-17 17:45
lantiantieyi
Rank: 1
等 级:新手上路
帖 子:9
专家分:5
注 册:2012-9-5
收藏
得分:0 
感谢了,收入囊中
2012-12-18 17:31
c语言DYY
Rank: 2
等 级:论坛游民
帖 子:51
专家分:44
注 册:2012-10-21
收藏
得分:3 
学习。。。收藏
2012-12-18 19:00
快速回复:n个人围成一圈报数,从1开始,凡报到3的退出,问留到最后的是几号?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019345 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved