| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1460 人关注过本帖
标题:晚自习两个钟头,就这个题目,硬是没有做出来。。
只看楼主 加入收藏
哆啦安梦
Rank: 2
来 自:哈尔滨理工大学软件
等 级:论坛游民
威 望:1
帖 子:31
专家分:49
注 册:2011-10-21
收藏
得分:1 
回复 6楼
话说我输入#include<conio.h>检查的时候提示有一个错误:fatal error C1083: Cannot open include file: 'conio.h': No such file or directory是什么情况,请大哥帮忙解释下,我是新手~

Press any key to continue_
2011-10-27 22:05
聪明他小毛
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2011-10-27
收藏
得分:1 
姐。你问的不是《c程序》的课后题吗?而c的另外一本实验指导书不都由答案吗。
2011-10-27 22:09
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:1 
以下是引用吴军旗在2011-10-26 01:33:13的发言:

有N个人围成一圈,顺序排号,从第一个人开始报数( 从1到3 ),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?

我当时遇到这个问题的解决方法:
设整个圈为array[N];遍历array,逢3置0,同时判断不为0的个数
伪码:
array[0...N-1]={1,2,3...N};
do
{
if(get_validcount()>1)
{
   //遍历array 逢3置0
}
else
break;
}while(1);
输出最后那个不为0的数

想象力征服世界
2011-10-27 23:35
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 楼主 吴军旗
我们知道第一个人(编号一定是(m-1)%n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2并且从k开始报0。现在我们把他们的编号做一下转换:k --> 0k+1 --> 1k+2 --> 2......k-3 --> n-3k-2 --> n-2序列1: 0, 1, 2, 3 … n-2, n-1序列2: 0, 1, 2, 3 … k-1, k+1, …, n-2, n-1序列3: k, k+1, k+2, k+3, …, n-2, n-1, 1, 2, 3,…, k-2,序列4:0, 1, 2, 3 …, 5, 6, 7, 8, …, n-3, n-2变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:∵ k=m%n;∴ x' = x+k = x+ m%n ; 而 x+ m%n 可能大于n∴x'= (x+ m%n)%n = (x+m)%n得到 x‘=(x+m)%n如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。(n-2)个人的解呢?当然是先求(n-3)的情况 ---- 这显然就是一个倒推问题!好了,思路出来了,下面写递推公式:令f表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n].递推公式:f[1]=0;f[i]=(f[i-1]+m)%i; (i>1)有了这个公式,我们要做的就是从1-n顺序算出f的数值,最后结果是f[n]。我们输出f[n]由于是逐级递推,不需要保存每个,程序也是异常简单:(注意编号是0 -- n-1)
#include <stdio.h>
int main(void)
{
    int n, m, i, s=0;
    printf ("N M = ");
    scanf("%d%d", &n, &m);
    for (i=2; i<=n; i++)
        s=(s+m)%i;
    printf ("The winner is %d\n",s);
    return 0 ;
}

[ 本帖最后由 embed_xuel 于 2011-10-28 00:01 编辑 ]

总有那身价贱的人给作业贴回复完整的代码
2011-10-27 23:59
dani337
Rank: 1
等 级:新手上路
帖 子:20
专家分:9
注 册:2011-10-25
收藏
得分:1 
都是牛人哦。没看明白。
2011-10-28 01:32
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
贴个代码出来
程序代码:
#include <stdio.h>
int main(int argc, char* argv[])
{
        const int N=10;
        const int M=3;
        const int S=1;
        int array[N];
        for(int i=0;i<N;++i)
        array[i]=i+1;
        printf("%d个人围成一圈\n",N);
        printf("从1开始,逢%d退出(模拟置0标示退出),剩余%d人时退出。\n\n模拟源数组:\n",M,S);
        for(int i=0;i<N;++i)
        printf("%d ",array[i]);
        int count=N;
        int j=0;
        do
        {
          if(count==S)
          break;
          for(int i=0;i<N;++i)
          {
             if(array[i])
             {
               ++j;
               if(j%M==0)
               {
                 array[i]=0;
                 --count;
               }
             }
             
          }
        }while(1);
        printf("\n模拟目标数组:\n");
        for(int i=0;i<N;++i)
        printf("%d ",array[i]);
        getchar();
        return 0;
}

想象力征服世界
2011-10-28 09:54
快速回复:晚自习两个钟头,就这个题目,硬是没有做出来。。
数据加载中...
 
   



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

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