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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangyuzhe 中级黑马   /  2015-2-23 14:38  /  1268 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
* 10、 耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是* 报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。
*/

#include <stdio.h>

int main(int argc, const char * argv[])
{
    int person[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    int count = 1;
    int i = 0;
    int temp = 0;
    while(i < 15)
    {
        if((count % 3 == 0 )&&(person[i] != 0))
        {
            person[i] = 0;
            i++;
            count++;
        }
        else if(count % 3 != 0)
        {
            i++;
            count++;
        }
        else if(person[i] == 0)
            i++;
        if(i == 15)
            i -= 15;
        for(int k = 0;k < 15;k++)
        {
            if(person[k] == 0)
                temp++;
            printf("%d",temp);
        }
        if(temp == 14)
            break;
        
    }
    for(int j = 0;j < 15; j++)
        if(person[j] != 0)
            printf("叛徒的序号为:%d",j);
   
    return 0;
}

12 个回复

倒序浏览
你的temp记录的什么?你的if语句 都不习惯用 { } 的么,你前面循环的那么一大堆东西都是temp(循环位置在第一个for里面的printf("%d",temp)处)你把person数组里面的数换成0之后,每次循环都temp都会+1,你的if语句最好 还是带上 { } 不带{ } if只包含它下面的那一条语句,如果if包含两条以上语句必须带上 { }
回复 使用道具 举报
本帖最后由 万里天 于 2015-2-23 18:54 编辑

。。。。。。。。。。。。。。。。
回复 使用道具 举报
本帖最后由 万里天 于 2015-2-23 18:55 编辑

。,。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
[url=forum.php?mod=redirect&goto=findpost&pid=1223514&ptid=171240][/url]

回复 使用道具 举报
if(temp == 14)             break; 永远不会被执行,因为 temp=14出现的位置应该在for循环结束之前,就变成15了
回复 使用道具 举报
在最后面那一段,if(person[j] != 0) ,不是‘=’号,应该用‘==’号。
回复 使用道具 举报
万里天 发表于 2015-2-23 18:44
你的temp记录的什么?你的if语句 都不习惯用 { } 的么,你前面循环的那么一大堆东西都是temp(循环位置在第 ...

首先谢谢你的关注和指点。我的大致思路是用count计数,每能被3整除,就把经历的数组元素储存的值改为0,如果遇到数组元素为0,则跳过(count不计数,但i++),如果i大于等于15就把i减去15,temp是用来储存值为0的数组元素的个数,我的想法是当数组中就剩一个不为0的时候,也就是temp为14个的时候(temp里面那个printf是应该删掉的,我在纠错的时候想看看是不是的确死循环了),跳出while循环,打印那个不为0的数组元素(即叛徒)
回复 使用道具 举报
万里天 发表于 2015-2-23 19:10
if(temp == 14)             break; 永远不会被执行,因为 temp=14出现的位置应该在for循环结 ...

感觉这里貌似没问题啊。。temp总有等于14的时候吧。不过的确是死循环了,看来没执行break
回复 使用道具 举报
Kman 发表于 2015-2-23 19:31
在最后面那一段,if(person[j] != 0) ,不是‘=’号,应该用‘==’号。

这个应该是没错的吧。。。
回复 使用道具 举报
哦对了,还有个很关键的地方我少写了条件,第一句else if应该是这样:else if((count % 3 != 0)&&(person[i] != 0))
回复 使用道具 举报
现在改成这样了,见楼下
回复 使用道具 举报
#include <stdio.h>

int main(int argc, const char * argv[])
{
    int person[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    int count = 1;
    int i = 0;
    int temp = 0;
    while(i < 15)
    {
        {
            if((count % 3 == 0 )&&(person[i] != 0))
            {
                person[i] = 0;
                i++;
                count++;
            }
            else if((count % 3 != 0)&&(person[i] != 0))
            {
                i++;
                count++;
            }
            else if(person[i] == 0)
            {
                i++;
            }

        }
        {
            if(i >= 15)
            {
                i -= 15;
            }

        }
        for(int k = 0;k < 15;k++)
        {
            if(person[k] == 0)
                temp++;
        }
        if(temp == 14)
            break;
        
    }
    for(int j = 0;j < 15; j++)
    {
        if(person[j] != 0)
            printf("叛徒的序号为:%d",j);
    }
   
    return 0;
}

回复 使用道具 举报
自己改好了,结贴
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马