黑马程序员技术交流社区

标题: 自己编的程序,求大神纠错,死循环了 [打印本页]

作者: yangyuzhe    时间: 2015-2-23 14:38
标题: 自己编的程序,求大神纠错,死循环了
/*
* 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;
}


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

。。。。。。。。。。。。。。。。

作者: 万里天    时间: 2015-2-23 18:52
本帖最后由 万里天 于 2015-2-23 18:55 编辑

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


作者: 万里天    时间: 2015-2-23 19:10
if(temp == 14)             break; 永远不会被执行,因为 temp=14出现的位置应该在for循环结束之前,就变成15了
作者: Kman    时间: 2015-2-23 19:31
在最后面那一段,if(person[j] != 0) ,不是‘=’号,应该用‘==’号。
作者: yangyuzhe    时间: 2015-2-23 23:54
万里天 发表于 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的数组元素(即叛徒)
作者: yangyuzhe    时间: 2015-2-23 23:59
万里天 发表于 2015-2-23 19:10
if(temp == 14)             break; 永远不会被执行,因为 temp=14出现的位置应该在for循环结 ...

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

这个应该是没错的吧。。。
作者: yangyuzhe    时间: 2015-2-24 00:06
哦对了,还有个很关键的地方我少写了条件,第一句else if应该是这样:else if((count % 3 != 0)&&(person[i] != 0))

作者: yangyuzhe    时间: 2015-2-24 00:18
现在改成这样了,见楼下
作者: yangyuzhe    时间: 2015-2-24 00:19
#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;
}


作者: yangyuzhe    时间: 2015-2-24 23:47
自己改好了,结贴




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2