免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lilovewu01
打印 上一主题 下一主题

[请教]---这有一道经典智力题,挑战编成逻辑思维 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-03-20 16:34 |只看该作者

回复 10楼 soul_of_moon 的帖子

看来你比我聪明多了,我承认当初学堆栈、链表和循环链表的时候我真的迷糊了。嘻嘻

论坛徽章:
0
12 [报告]
发表于 2006-03-20 16:39 |只看该作者
这是我当初刚学C++的时候,用最笨的方法写的程序!

大家都不回,那我就抛砖引玉!:em11::em11:

# include<iostream>

int main()
{
        int a,j,*p,b;  //用j来计算每数3次跳一个,用b来计算已经跳下去的人数
        int s[100];
        using namespace std;

        cout<<"请输入船上的人数(3-100):"<<endl;
        cin>>a;

        s[0]=1;
        p=&s[0];
        b=0;

        for(int i=1;i<a;i++)
                s[i]=s[i-1]+1;   //为数组中每个元素附值,为每个人定位(从1到a)

        for(i=0,j=1;i<a;i++,j++)
        {
                if(*(p+i)!=0)  //判断该元素是否为0(0表示以跳海的人)
                {
                        if(j%3==0)   //判断是否数到了3
                        {
                                *(p+i)=0;  //将这个位置的元素值为0(表示此人已跳海)
                                b=b+1;  //将跳海人数加1
                        }
                }
                else j=j-1;  //如果该元素为0,将j减1,即此处不算一次(表示跳过此元素)
               
                if(i==a-1)  //判断是否到了数组最后
                {
                        p=&s[0];  //将指针重新指向数组首地址
                        i=-1;  //将i也相应的值为首地址的值
                }

                if(b==a-1)  //判断是否只剩下一个活着的人
                        break;  //剩下一个活着的人时退出循环
        }
        for(i=0;i<a;i++)
        {
                if(s[i]!=0)  //找数组中剩下的唯一的非零数,即唯一活着的人
                        cout<<s[i]<<endl;  //输出此人的位置
        }
        return 0;
}

论坛徽章:
0
13 [报告]
发表于 2006-03-20 16:46 |只看该作者
原帖由 lilovewu01 于 2006-3-20 16:34 发表
看来你比我聪明多了,我承认当初学堆栈、链表和循环链表的时候我真的迷糊了。嘻嘻

也不能这么说,看我的签名档。其实你可以看一下钱能的《c++程序设计教程》,里面对这个题目讲得比较全,从数组到链表,再到循环链表,接下去就不知道了,因为太久了,记不清了。

论坛徽章:
0
14 [报告]
发表于 2006-03-20 16:48 |只看该作者
原帖由 lilovewu01 于 2006-3-20 16:39 发表
这是我当初刚学C++的时候,用最笨的方法写的程序!

大家都不回,那我就抛砖引玉!:em11::em11:

# include<iostream>

int main()
{
        int a,j,*p,b;  //用j来计算每数3次跳一个,用b来计算已经跳下 ...

前面不是有人贴了吗?只不过是链接而已

论坛徽章:
0
15 [报告]
发表于 2006-03-20 17:18 |只看该作者

回复 14楼 soul_of_moon 的帖子

高人!

看看我当初写的程序如何啊...

再怎么也是***原创***啊! 嘻嘻

当年可是30多个人中就几个人做出来的啊!

论坛徽章:
0
16 [报告]
发表于 2006-03-20 17:28 |只看该作者
原帖由 lilovewu01 于 2006-3-20 17:18 发表
高人!

看看我当初写的程序如何啊...

再怎么也是***原创***啊! 嘻嘻

当年可是30多个人中就几个人做出来的啊!


什么意思?
指你所在的班级中的30号人么?
30多个人中就几个人做出来

这些人也太不用功了,丢人

论坛徽章:
0
17 [报告]
发表于 2006-03-20 17:46 |只看该作者
原帖由 westgarden 于 2006-3-20 17:28 发表


什么意思?
指你所在的班级中的30号人么?

这些人也太不用功了,丢人





哈哈!被你说对了,确实很不用功,包括我在内(见笑了!)。

但虽然不用功,我还是做上来了(臭屁了!)。

还有一点,我们当时可是刚刚学完C++的基础语法,接触C++不到2个星期哦!

论坛徽章:
0
18 [报告]
发表于 2006-03-20 17:52 |只看该作者
赞一个,看了这些东西
自己还需要努力才行

论坛徽章:
0
19 [报告]
发表于 2006-03-20 22:27 |只看该作者
原帖由 lilovewu01 于 2006-3-20 11:39 发表
跳海问题:

一艘远航船上,因食物不足,只够一人到达目的地。所以船员们要选出一名幸运儿。而其他人必须跳海自杀。

    选法如下:
        船员站成一排,第一个人从1开始数数,数到3的人跳海,跳下海的下 ...

小孩出列问题?

论坛徽章:
0
20 [报告]
发表于 2006-03-21 08:34 |只看该作者
也是从具体数学看的.

  1. static    int
  2. josephus(int n,int m)
  3. {
  4.     int jn,m1,n1;

  5.     for(n1 = 2,jn = 1;n1 <= n; n1++){
  6.         m1 = m;
  7.         if(m1 > n1)
  8.             m1 %= n1;
  9.         if(jn > n1 - m1)
  10.             jn -= (n1 - m1);
  11.         else
  12.             jn += m1;
  13.     }

  14.     return    jn;
  15. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP