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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 chingwei2011 于 2015-10-12 13:14 编辑

忘了贴题目,就是15个人围一个圈,轮流报数1,2,3.报到3的退出游戏,下一位又从1开始报,以此类推,最后留下来的那个是多少编号。
对于这道题算法很多,这个算法我想了很久,很笨,倒是能最直接的翻译这道题。
#include <stdio.h>
int main(int argc, const char * argv[]) {
    int last[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    static int count=1;// 一定要用静态修饰符 修饰,否则在flag==2的时候会出现死循环的问题。
    int flag = 15;//15个人需要判断14次
    while(flag > 1){
        for(int i = 0; i < 15; i++){
            if(count == 3 && last != 0){ //累计数3次的时候,从剩下的人中再排除一个
                last = 0;//将被排除掉的人赋值0,表示已排除
                count=1;//从新计算步数
                flag--;
                //printf("B [%d] ,flag=%d\n",i,flag);
            }
            else if(last != 0)
            {
                count++;
                //printf("A [%d], count=%d\n",i,count);
            }               
        }
    }
    for( int i =0 ;i < 15 ;i++)
        if(last!=0){
            printf("15人中第%d个是嫌疑人!\n",last);
        }

评分

参与人数 2黑马币 +20 收起 理由
IOS进击小强 + 10 很给力!
wuchuanyuan + 10 赞一个!

查看全部评分

38 个回复

正序浏览

谢谢大哥。。。学习了
回复 使用道具 举报
chingwei2011 发表于 2015-10-14 11:39
嗯嗯是要报下个月11号的吗。。

是的是的
回复 使用道具 举报
学习了,OC作为C的拓展,还真是简单了许多
回复 使用道具 举报
好厉害啊
回复 使用道具 举报
谢谢大哥,我基础测试也是这个,没有写出来
回复 使用道具 举报
  1. #include <stdio.h>

  2. int main(int argc, const char * argv[]) {
  3.    
  4.     //定义一个数组并全部初始化为0
  5.     int p[15]={0};
  6.     //i用来标记该元素是否应该退出,j用来无限循环数组元素,k标记剩余人数
  7.     int i=1,j=15,k=15;
  8.     //只要剩余人数大于1,就一直进行循环
  9.     while(k>1){
  10.         //数组元素值为0,代表尚未出局,可参与循环,值为1,则表示已经出局,不参与循环
  11.         //如果数组中该元素的值为0,并且该元素没有被标记为3,则标记i++
  12.         if(p[j%15]==0&&i!=3){
  13.             i++;
  14.             
  15.             //如果数组中某元素值为0,且被标记为3,则将该元素值改为1,表示该元素出局,同时标记计数器重置为1,剩余人数-1
  16.         }else if(p[j%15]==0&&i==3){
  17.             p[j%15]=1;
  18.             i=1;
  19.             k--;
  20.         }
  21.         //不管结果如何,j都会进行自加运算,以保证下一元素进入循环
  22.         j++;
  23.     }
  24.     //当剩余人数为1的时候,while结束,用找出为0的人,就是叛徒,它的序号就是该元素的下标+1
  25.     for(i=0;i<15;i++){
  26.         if(p[i]==0){
  27.             printf("出卖耶稣的序号是:%d\n",i+1);
  28.         }
  29.     }
  30.     return 0;
  31. }
复制代码
回复 使用道具 举报
408205555 发表于 2015-10-13 21:21
我运行你的代码了,是死循环。

其实一个while循环就可以搞定。

晕死。我运行结果是正常的,vc++和xcode环境都运行 显示结果是 5.好我再试试。谢谢
回复 使用道具 举报
黑马公公007 发表于 2015-10-14 08:17
你看我等级跟技术分,没呐!

嗯嗯是要报下个月11号的吗。。
回复 使用道具 举报
chingwei2011 发表于 2015-10-13 20:05
喔谢谢,你已经进到黑马了吗。

你看我等级跟技术分,没呐!
回复 使用道具 举报
chingwei2011 发表于 2015-10-13 20:07
1.有跳出循环的条件,就是判断到14次的时候 ,就会跳出,即flag==1的时候 跳出
感谢你的点评。我下次会 ...

我运行你的代码了,是死循环。

其实一个while循环就可以搞定。

里面的for循环显得有些多余。

可以通过定义一个数组索引 i 来进行判断和取数组中的值。
回复 使用道具 举报
408205555 发表于 2015-10-13 11:47
楼主,你代码不仅书写错误,而且逻辑也错误。

1、while是死循环,()里直接写1就行了

1.有跳出循环的条件,就是判断到14次的时候 ,就会跳出,即flag==1的时候 跳出
感谢你的点评。我下次会仔细些。非常感谢你的指导
回复 使用道具 举报
黑马公公007 发表于 2015-10-13 08:57
能不能悄悄的告诉你,我在做入学测试的时候写过这道题

喔谢谢,你已经进到黑马了吗。
回复 使用道具 举报
本帖最后由 snowimba 于 2015-10-13 15:09 编辑
408205555 发表于 2015-10-13 11:52
你的代码也是错的。

复制粘贴的时候系统把arr后面漏了【i】,这个是系统默认屏蔽的,我前面看到了,懒得改了,毕竟懂代码的都明白,自己可以加上。其他的地方还有什么错误请指出来,我敢发上来肯定是运行过的,没有错误,而且得出结果的。我的是那个OC代码,你既然说错了,应该有理由的,还望指出。
回复 使用道具 举报
学习学习
回复 使用道具 举报
写的这么简单额,你还需要像白马哥学习啊,我在龙之港,可以一起探讨。。
回复 使用道具 举报
snowimba 发表于 2015-10-12 20:39
#import
int main(int argc, const char * argv[]) {    @autoreleasepool {//        创建一个可变数组 ...

你的代码也是错的。
回复 使用道具 举报
楼主,你代码不仅书写错误,而且逻辑也错误。

1、while是死循环,()里直接写1就行了
2、while是死循环,没有跳出循环的条件会一直死循环。
3、while死循环里放一个for循环,完全不懂什么意思,而且运行也没结果,说明逻辑错了。
4、约瑟夫环,只是一个环,只在一个环里转,要有合适的判断条件和跳出机制。
回复 使用道具 举报
好厉害的样子
回复 使用道具 举报
能不能悄悄的告诉你,我在做入学测试的时候写过这道题
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马