| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 344 人关注过本帖
标题:高手快来帮帮我
只看楼主 加入收藏
ucfhvqdo
Rank: 2
等 级:论坛游民
帖 子:13
专家分:49
注 册:2009-7-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
高手快来帮帮我
高手快来帮帮我

//n个人围成一圈,从第一个人开始,从1—3循环报数,报道3的人退出圈子,然后下一个人继续报数,问最后留下来的那个人原来的编号。

#include <stdio.h>
int main()
{
    int i,j,n;
    do{
        scanf("%d",&n);
        for(j=1,i=2;i<=n;i++){
            j= j+3>i?j+3-i:j+3;
        }
        printf("remain %d\n",j);
    } while (n);
   return 0;
}
能详细解释一下(for)语句那个条件表达式是怎样推算出来的吗
搜索更多相关主题的帖子: 高手快来帮帮我 
2009-08-19 00:47
ljt0000mf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:104
专家分:157
注 册:2009-7-4
收藏
得分:3 
在线等答案
高手快来啊
2009-08-19 10:59
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:3 
循环数=2时:             循环数=3时:           循环数=4时:
j   n 循环后剩下的数     j   n 循环后剩下的数   j   n 循环后剩下的数
1+2 2   1                1+3 2    2            -1+4 2    1  
1+2 3   3                2+3 3    2             1+4 3    2
3+2 4   1                2+3 4    1             2+4 4    2
1+2 5   3                1+3 5    4             2+4 5    1
3+2 6   5                4+3 6    1             1+4 6    5
   .                         .                      .
   .                         .                      .
   .                         .                      .
   .                         .                      .
从上面看出下一个j是等于上次“循环后剩下的数”

先算出j的起始数就好办,还要先自己算出2人时谁是剩下的
假如循环数为2,总人数也为2,1是剩下的,j现在未知,但可以算出来。
j+2-n=1  j=(n+1)-2  n=2  j=1

___________________________________________________________________

假如循环数为3,总人数也为2,2是剩下的,j现在未知。
j+3-n=2  j=(n+2)-3  n=2  j=1

______________________________________________________________________
这方法对循环数4前的都正确,
但按这方法来算5
假如循环数为5,总人数也为2,2是剩下的,j现在未知。  
j+5-n=2  j=(n+2)-5  n=2  j=-1  

假如循环数为5,总人数变3时, 1是剩下的
j+5-n=1  j=(n+1)-5  n=3  j=-1       /*这里j不等于上次"上次剩下的数"*/

假如循环数为5,总人数变4时, 2是剩下的
j+5-n=2  j=(n+2)-5  n=4  j=1       /*到这时才开始等于"上次剩下的数"*/

假如循环数为5,总人数变5时, 2是剩下的
j+5-n=2  j=(n+2)-5  n=5  j=2   
 
假如循环数为5,总人数变6时, 2是剩下的  
j+5-n=1  j=(n+1)-5  n=5  j=2   

________________________________________________________
上面可以看出,j为正数时,后面的推算才准确。

****************************************************************
以上是我推算的,是有点逻辑,但不能成公式,郁闷。
“j= j+3>i?j+3-i:j+3;”这表达式从什么公式算出来的看不出了。
还有谁来说一说。
****************************************************************

努力—前进—变老—退休—入土
2009-08-19 14:12
liu1987lang
Rank: 2
等 级:论坛游民
帖 子:42
专家分:44
注 册:2007-4-22
收藏
得分:3 
你试试用链表做,记得学数据结构的时候就有这么一个课后题。
2009-08-19 14:14
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
收藏
得分:3 
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。      

我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):  

     k  k+1  k+2  ... n-2,     n-1,    0,  1,     2, ... k-2,(k-1)并且从k开始报0。
   
<==> 0  1    2   ...n-2-k,    n-1-k,  n-k,   ...         n-2 ,(n-1)
变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!x'为n个人报数时的最终结果。
①:x值在0~n-1-k之间时,倒回去的结果为x'=x+k; <==>  x'=(x+k)%n
②:x值在n-k~n-2之间并且k>=2,倒回去的结果为x'=x+k-n(0<=x'<=k-2<n); <==> x'=(x+k-n)%n <==> x'=(x+k-n+n)%n=(x+k)%n

不好意思,推到这搞不定了,等别人来解答吧。。。

问题出现在k=1的时候,

2009-08-19 18:32
快速回复:高手快来帮帮我
数据加载中...
 
   



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

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