| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1851 人关注过本帖
标题:这怎么做啊,请大神们给我参考下
只看楼主 加入收藏
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
结帖率:76.47%
收藏
已结贴  问题点数:20 回复次数:17 
这怎么做啊,请大神们给我参考下
题目描述
 n个人排成一圈,按顺时针方向依次编号1,2,3…n。从编号为1的人开始顺时针"一二"报数,报到2的人退出圈子。这样不断循环下去,圈子里的人将不断减少。最终一定会剩下一个人。试问最后剩下的人的编号。

输入
 不超过1000组数据。

每组数据一行,每行一个正整数,代表人数n。 (1 <= n < 2^31)

输出
 每组输入数据输出一行, 仅包含一个整数,代表最后剩下的人的编号。


样例输入
7
2
样例输出
7
1
搜索更多相关主题的帖子: 顺时针 正整数 
2016-06-21 15:34
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:8 
看到 n < 2^31 就应该知道这道题必须用公式了
假如编号是从0开始计,那么公式就是 f(n) = ( f(n-1) + 2 )%n
程序代码:
#include <stdio.h>

int main( void )
{
    for( unsigned n; scanf("%u",&n)==1; )
    {
        unsigned f = 0;
        for( unsigned i=1; i<=n; ++i )
            f = (f+2)%i;
        printf( "%u\n", f+1 );
    }

    return 0;
}

2016-06-21 16:07
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
收藏
得分:0 
这么短的代码 我想说这个f=(f+2)%i是什么意思啊?
2016-06-21 16:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
这样仍然太慢,还得优化,从结果上看是有规律的
0
0 2
0 2 4 6
0 2 4 6 8 10 12 14
0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
即每次长度增加一倍
(我马上要下班了,代码就不写了)
2016-06-21 16:15
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
收藏
得分:0 
还有结果是时间超限
2016-06-21 16:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
以下是引用w4654646在2016-6-21 16:16:04的发言:

还有结果是时间超限
已经说了,这还需要优化
算法:将n的二进制形式去掉最高位,然后乘以二加1。就行了
例如 7,二进制是 111,去掉最高位就是 11,也就是十进制的3,然后乘以2加1结果就是 3*2+1=7
太简单了,代码自己写
2016-06-21 16:26
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
收藏
得分:0 
大神们还有谁能写下别的代码吗 参考下
2016-06-21 16:26
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:12 
程序代码:
        scanf("%d", &loop);
        count = 0;
        j = loop;
        for (i = 0; j > 0; i++)
        {
            j = j / 2;
            count++;
        }
        printf("最后编号:%d\n", (int)(2 * (loop - (pow(2, count - 1))) + 1));
2016-06-21 16:35
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
收藏
得分:0 
回复 6楼 rjsp
这 还是不会
2016-06-21 16:35
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
收藏
得分:0 
回复 8楼 grmmylbs
看不懂 这是用C语言的?
2016-06-21 16:39
快速回复:这怎么做啊,请大神们给我参考下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.074711 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved