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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁铭检 中级黑马   /  2015-6-16 09:35  /  1660 人查看  /  22 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

上面是我基础测试题的最后一题答案,最后的输出是正确的,不过程序貌似进入了死循环,自我感觉可能是数组的溢出或是指针,求大牛帮我详细的解说一下。。

22 个回复

倒序浏览
本帖最后由 fanxing 于 2015-6-16 10:38 编辑

我大概看了一下,觉得有个地方你是不是应该考虑下:
再说我觉得你是不是题意理解错了,我觉得它应该是从头到尾像一个圆一样循环的报数,而不是每次从开头报数。
回复 使用道具 举报
fanxing 发表于 2015-6-16 10:28
我大概看了一下,觉得有个地方你是不是应该考虑下:
再说我觉得你是不是题意理解错了,我觉得它应该是从头 ...

这我自我感觉逻辑上还是没错了。。
回复 使用道具 举报
等等我再看看
回复 使用道具 举报
fanxing 发表于 2015-6-16 10:28
我大概看了一下,觉得有个地方你是不是应该考虑下:
再说我觉得你是不是题意理解错了,我觉得它应该是从头 ...

表示灰常的感谢。。
回复 使用道具 举报

这个貌似是我的逻辑出错了。。
回复 使用道具 举报
学得挺快啊,都学到这了
回复 使用道具 举报
本帖最后由 fanxing 于 2015-6-16 11:15 编辑

第二个while循环,你每次while出列的人数不是一个人,n--造成了混乱
回复 使用道具 举报
落水的兔子 发表于 2015-6-16 11:04
学得挺快啊,都学到这了

表示大一就学过C了,现在只是复习而已,所以C语言那部分我会看的比较快。。
回复 使用道具 举报
C我也学过好几年了,但是感觉有些细节问题都忘了,有点印象但是记不清了
回复 使用道具 举报
我刚才测试了一下,当人数为3个人时,最后剩下两个人
回复 使用道具 举报
你看看是不是
回复 使用道具 举报

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

*/

#include <stdio.h>
int main(int argc, const char * argv[]) {
    // insert code here...
    char str[15],*p;
    int n = 15,j,m=1 ;
    for (int i=1; i<=15; i++) {
        str[i -1] = (char)i;
    }
    while (n > 1) {
         p = str;
         j=0;
        while (*p != '\0') {
            str[j++] = *p++;
            if(m% 3 == 0){
                p++;
            }
        }
    m++;
        n--;
        str[j] = '\0';
    }
    for (int x =0;str[x] != '\0' ; x++) {
        printf("叛徒原来的序号为:%d\n",str
这里加的M表示我给每个人加的下标。。
回复 使用道具 举报
我还是不太懂题目的意思
最后到底剩下一个人还是两个人
回复 使用道具 举报
fanxing 发表于 2015-6-16 11:14
我还是不太懂题目的意思
最后到底剩下一个人还是两个人

在草纸上我算的是,还剩两个。。分别是5和14
回复 使用道具 举报
本帖最后由 fanxing 于 2015-6-16 11:26 编辑
丁铭检 发表于 2015-6-16 11:13
10、 耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个 ...

应该就是第二个while循环的问题,n--有问题,第一次while循环应该出列5个人
回复 使用道具 举报
谢谢各位的提点,根据大家的提点我已经将最后结果得出,虽然还会出现溢出的问题。。不过还是谢谢大家。。最后把我的终极代码附上。。
回复 使用道具 举报
#include<stdio.h>

int main()
{
        int a[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        int count=15;
        int j=0;
        while(count>1)
        {
                for(int i=0;i<15;i++)
                {
                        if(a[i]!=0)
                        {
                                j++;
                                if(j==3)
                                {
                                        j=0;
                                        count--;
                                        a[i]=0;
                                }
                        }
                }
        }
        for(int i=0;i<15;i++)
        {
                if(a[i]!=0)
                {
                        printf("叛徒是第%d 个人",a[i]);
                }
        }
回复 使用道具 举报
有这么麻烦么。。。:o
回复 使用道具 举报
大家的基础测试题都是一样的呢,我的最后一题也是这个,顺便看看此贴,学习一下啦
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马