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 个回复

倒序浏览
赞,顶一个
回复 使用道具 举报
著名的约瑟夫环的问题,楼主好棒,加油
回复 使用道具 举报
楼主从哪找的题啊?
回复 使用道具 举报
帮顶!!!!!!!!!!!
回复 使用道具 举报
wxd123 发表于 2015-10-10 23:31
楼主从哪找的题啊?

自己想的。。。 这是出自黑马的测试基础题目
回复 使用道具 举报
yufanyufan77 发表于 2015-10-11 15:30
帮顶!!!!!!!!!!!

谢谢哥。。。
回复 使用道具 举报
CherryQueen 发表于 2015-10-10 22:45
著名的约瑟夫环的问题,楼主好棒,加油

一起加油呀,小兄弟。
回复 使用道具 举报
咦,有点眼shu,难道……是改的?
回复 使用道具 举报
gabriel2016 发表于 2015-10-11 16:04
咦,有点眼shu,难道……是改的?

自己写的哦。。连这样的都还要去抄袭,有什么值得贴出来的。
回复 使用道具 举报
“约瑟夫环”
回复 使用道具 举报
嗯嗯你说的是对的。这也是黑马的测试基础题的其中一道。。
回复 使用道具 举报

嗯嗯你说的是对的。这也是黑马的测试基础题的其中一道。。
回复 使用道具 举报
不错不错,我百度出来的算法对数学要求太高了。。瞬间感觉大学白上了。。。。
回复 使用道具 举报
原来如此,小白学习了,谢谢啊!
回复 使用道具 举报
白马哥 发表于 2015-10-12 13:02
原来如此,小白学习了,谢谢啊!

谢谢白马哥指点,传递正能量!!
回复 使用道具 举报
用OC写了写下,10行不到搞定,一个while加一个for,看来OC真是方便多了
回复 使用道具 举报
snowimba 发表于 2015-10-12 16:44
用OC写了写下,10行不到搞定,一个while加一个for,看来OC真是方便多了

小哥。。。你贴下代码 我想看看,学习下。。。非常感谢。
回复 使用道具 举报
chingwei2011 发表于 2015-10-12 20:26
小哥。。。你贴下代码 我想看看,学习下。。。非常感谢。

  1. 注释是刚才现场看代码写的,将就看吧
复制代码
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
//        创建一个可变数组
            NSMutableArray *arr =[NSMutableArray array];
//        循环给可变数组赋值1-15
                    for (int i=0; i<15; i++) {

                [arr addObject:@(i+1)];

    }
//        定义一个计数器
        int count=0;

//        定义循环,直到数组只剩下一个元素停止
        while (((int)arr.count)>1) {
//            循环遍历数组
            for (int i=0; i<arr.count; i++) {
//                每循环一个元素,计数器就加一
                count++;
//                判断计数器是否为3
                if (count==3) {
//                    数组对应的元素变成“-”
                    arr=@"-";
//                    计数器归零
                    count=0;
                }
            }
//            将数组中所有“-”删除,然后再次循环
            [arr removeObject:@"-"];

        }

//        打印数组
        NSLog(@"%@",arr);
    }
    return 0;
}
回复 使用道具 举报
snowimba 发表于 2015-10-12 20:39
#import
int main(int argc, const char * argv[]) {    @autoreleasepool {//        创建一个可变数组 ...

感觉思路挺像的,OC的语法确实简练。厉害,学习了、
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马