A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© DYKJ12 初级黑马   /  2014-7-11 11:07  /  1194 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 DYKJ12 于 2014-7-17 16:38 编辑

耶稣有13个门徒,其中有一个是叛徒,13人坐一圈,从第一个开始报号:123123⋯⋯,凡是报到“3”就退出圈子,最后留下的人就是叛徒,找出它原来的序号。脑子里没有思路呀。在网上查找了一下,但是没有太懂。
#include"stdio.h"
int main()
{int a[10000]={0};
int b,c,d=0,e=0,j,s,r;
int *p;
void h(int x[]);
printf("请输入总人数:");
scanf("%d",&b);
for(c=0;c<b;c++)
a[c]=c+1;
p=a;
for(s=0;;s++)
{for(r=0,e=0;e<b;e++)
{if(*(p+e)!=0)
{j=*(p+e);
r++;
}
}
if(r==1)break;
for(c=0;c<b;c++)
{if(*(p+c)==0)continue;
d++;
if(d%3==0)
{
*(p+c)=0;
}
}
}
printf("背叛者是第%d位\n",j);
return 0;
}


2 个回复

倒序浏览
又是你呀。这个问题你可以百度约瑟夫环。百度上有详细的解决办法。
下面代码是我写的。我觉得还是很容易懂的。已经在xcode上运行通过了。
#include <stdio.h>

int main(){
   
        //定义flag标志,用来查数(1,2,3)
   
        int flag = 0;
    //定义out变量,用来记录离开的门徒的数量
        int out = 0;
    //定义一个数组,用来表示15个门徒
        int person[15];
    //给15个门徒从1到15排序。
        for(int i=0;i<15;i++){
                person[i]=i+1;
        }
    //定义变量i用来反复循环person数组,模拟查数(1,2,3)的顺序
    int i = 0;
    //当记录离席人数的out变量达到14个人时,剩下的就是叛徒。
        while(out<14){
        //模拟门徒查数,这里以0作为是否离席的判断条件
                if(person[i]!=0){
                        flag++;
            printf("flag = %d,",flag);
            printf("person%d\n",i+1);
                }
        //当查到3时,该人离席,同事将他的编号赋值为0;
                if(flag==3){
                        person[i]=0;
            printf("the person%d is out\n",i+1);
            //flag清空,表示要从1开始重数。
                        flag=0;
            //离席人数加1
                        out++;
                }
        //i反复循环
                i++;
                if(i==15){
                        i=0;
                }
        }
    //后台验证离席人数是否达到14
    printf("out = %d\n",out);
    //后台验证目前的数组内容情况是否和预想的一样:
    //应该只剩下一个元素有编号,其他元素都为0,表示离席.
    for(int i=0;i<15;i++){
        printf("%d\n",person[i]);
    }
    //打印出最后没有离席的叛徒的编号:
        for(int i=0;i<15;i++){
                if(person[i] == 0){
                        person[i++];
                }else{
                        printf("叛徒是:%d\n",person[i]);
         
                }
        }
       
        //程序结束
        return 0;
}

点评

谢谢你啊。小马。你是不是一直在论坛呀。看你挺积极的。  发表于 2014-7-11 11:53
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马