黑马程序员技术交流社区

标题: 关于我基础测试最后一题 [打印本页]

作者: 丁铭检    时间: 2015-6-16 09:35
标题: 关于我基础测试最后一题
上面是我基础测试题的最后一题答案,最后的输出是正确的,不过程序貌似进入了死循环,自我感觉可能是数组的溢出或是指针,求大牛帮我详细的解说一下。。

作者: fanxing    时间: 2015-6-16 10:28
本帖最后由 fanxing 于 2015-6-16 10:38 编辑

我大概看了一下,觉得有个地方你是不是应该考虑下:
再说我觉得你是不是题意理解错了,我觉得它应该是从头到尾像一个圆一样循环的报数,而不是每次从开头报数。

作者: 丁铭检    时间: 2015-6-16 10:40
fanxing 发表于 2015-6-16 10:28
我大概看了一下,觉得有个地方你是不是应该考虑下:
再说我觉得你是不是题意理解错了,我觉得它应该是从头 ...

这我自我感觉逻辑上还是没错了。。
作者: fanxing    时间: 2015-6-16 10:45
等等我再看看

作者: 丁铭检    时间: 2015-6-16 10:49
fanxing 发表于 2015-6-16 10:28
我大概看了一下,觉得有个地方你是不是应该考虑下:
再说我觉得你是不是题意理解错了,我觉得它应该是从头 ...

表示灰常的感谢。。
作者: 丁铭检    时间: 2015-6-16 10:50
fanxing 发表于 2015-6-16 10:45
等等我再看看

这个貌似是我的逻辑出错了。。
作者: 落水的兔子    时间: 2015-6-16 11:04
学得挺快啊,都学到这了
作者: fanxing    时间: 2015-6-16 11:06
本帖最后由 fanxing 于 2015-6-16 11:15 编辑

第二个while循环,你每次while出列的人数不是一个人,n--造成了混乱
作者: 丁铭检    时间: 2015-6-16 11:07
落水的兔子 发表于 2015-6-16 11:04
学得挺快啊,都学到这了

表示大一就学过C了,现在只是复习而已,所以C语言那部分我会看的比较快。。
作者: 落水的兔子    时间: 2015-6-16 11:08
C我也学过好几年了,但是感觉有些细节问题都忘了,有点印象但是记不清了
作者: fanxing    时间: 2015-6-16 11:11
我刚才测试了一下,当人数为3个人时,最后剩下两个人
作者: fanxing    时间: 2015-6-16 11:12
你看看是不是

作者: 丁铭检    时间: 2015-6-16 11:13
fanxing 发表于 2015-6-16 10:45
等等我再看看

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
我还是不太懂题目的意思
最后到底剩下一个人还是两个人
作者: 丁铭检    时间: 2015-6-16 11:19
fanxing 发表于 2015-6-16 11:14
我还是不太懂题目的意思
最后到底剩下一个人还是两个人

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

应该就是第二个while循环的问题,n--有问题,第一次while循环应该出列5个人
作者: 丁铭检    时间: 2015-6-16 13:03
谢谢各位的提点,根据大家的提点我已经将最后结果得出,虽然还会出现溢出的问题。。不过还是谢谢大家。。最后把我的终极代码附上。。
作者: 飞翔的猪    时间: 2015-6-16 13:46
#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]);
                }
        }

作者: 飞翔的猪    时间: 2015-6-16 13:47
有这么麻烦么。。。:o
作者: ITClody    时间: 2015-6-16 13:56
大家的基础测试题都是一样的呢,我的最后一题也是这个,顺便看看此贴,学习一下啦
作者: 丁铭检    时间: 2015-6-16 15:10
飞翔的猪 发表于 2015-6-16 13:47
有这么麻烦么。。。

只能说每个人的思路不一样,我想可能复杂了。。
作者: 丁铭检    时间: 2015-6-16 15:13
飞翔的猪 发表于 2015-6-16 13:46
#include

int main()

你这程序看着好简单,一下就看懂了。感谢你的分享。。
作者: 飞翔的猪    时间: 2015-6-17 09:15
丁铭检 发表于 2015-6-16 15:13
你这程序看着好简单,一下就看懂了。感谢你的分享。。

分享才是学习知识的初衷,:lol




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