| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1257 人关注过本帖
标题:抽奖问题求解
只看楼主 加入收藏
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
结帖率:56.25%
收藏
已结贴  问题点数:5 回复次数:1 
抽奖问题求解
题目大致如下:
有N个抽奖者,他们站成一个圈,给定一个由M个整数构成的序列A。现在从第一个人开始报数,第一个人数1,第二个人数2.....当报到A1时,那个人就被淘汰,然后淘汰者的下一个人从1开始报数…当数到第N个人以后,又从第一个人继续报,当谁数到A2时,谁就被淘汰。剩下的人又继续数……如果序列A里面取到最后一个数Am时,又取A1作为新一轮淘汰的数,依次循环。最后一个剩下来的人就是中奖的人。
比如现在有5个人,有3个整数构成的序列2,4,7
刚开始时:1,2,3,4,5(将要淘汰的报数2,即A1)
第一次后:1,3,4,5(序号为2的人报了2,所以被淘汰,接着从序号为3的人开始报数,将要淘汰的报数为4,即A2)
第二次后:3,4,5(序号为1的人报了4,所以被淘汰,接着从序号为3的人开始报数,将要淘汰的报数为7,即A3)
第三次后:4,5(序号为3的人报了7,所以被淘汰,接着从序号为4的人开始报数,将要淘汰的报数为2,又从头来取A1)
第四次后:4(序号为5的人报了2,所以被淘汰,4号为中奖者)

这个程序该怎么写?我用数组写,都是死循环。
2016-02-26 23:51
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:5 
此题逻辑性比较强,需要认真思考,理清关系。下面是我的想法。
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define M 3
#define N 5

int main()
{
    int A[M]={2,4,7},person[N]={1,2,3,4,5};  //淘汰的人的序号记为0
    int personLeft;  //淘汰后剩余的人数
    int index_A=0;   //要淘汰的报数数组下标
    int index_person=0;  //抽奖人的数组下标
    int luckyOne;  //标记中奖人的序号
    int i,j;
    
    //先输出原始的N个抽奖人
    for(i=0;i<N;i++)
    {
        printf("%d ",person[i]);
    }
    printf("\n");

    do
    {
        personLeft=0;
        j=0;
        for(i=index_person;i<N;i++)  //从index_person开始报数
        {
            if(person[i]!=0) j++;  //没有淘汰的人依次报数并统计
            if(j==A[index_A])  //当统计的报数等于要淘汰的报数
            {
                person[i]=0;  //将报此数的人淘汰
                if((N-1)==i) i=-1;  //如果此人恰好是最后一个人,i=-1,下面index_person自加1变为0,从头开始下一轮报数
                index_person=i+1;  //index_person置于被淘汰人的后一个人
                if(index_A==(M-1)) index_A=-1;  //如果要淘汰的报数是最后一个,下一轮要淘汰的报数是第一个
                index_A+=1;  //index_A置于下一个要淘汰的报数
                break;  //淘汰一个人后退出for进入下一轮
            }
            if((N-1)==i) i=-1;  //当报数到最后一个人时,仍没有匹配时,从第一个抽奖人继续报数
        }
        
        //输出淘汰操作后的情况,并计算剩余的人数
        for(i=0;i<N;i++)
        {
            printf("%d ",person[i]);
            if(person[i]!=0)
            {
                luckyOne=person[i];
                personLeft++;
            }
        }
        printf("\n");
    }while(personLeft>1);  //只有剩余的人数等于1时,才停止操作

    printf("The lucky guy is:%d\n",luckyOne);

    return 0;
}

图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2016-2-27 09:49编辑过]


   唯实惟新 至诚致志
2016-02-27 09:40
快速回复:抽奖问题求解
数据加载中...
 
   



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

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