标题:猴子选大王问题,不知为何我的程序运行不起来
只看楼主
lol1234
Rank: 1
等 级:新手上路
帖 子:46
专家分:3
注 册:2014-4-11
得分:0 
回复 9楼 lol1234
我想了一下 我觉得我的想法有问题 因为万一要报的数字比猴子数多我的算法就错了。。。  哎。。。只用数组感觉好难做啊
2014-04-12 00:27
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
count = (count + 1) % n

可以实现循环


[fly]存在即是合理[/fly]
2014-04-12 00:42
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
得分:1 
感觉像是谭浩强c 10.5啊 拉出来原来做的题 改了一下。。

程序代码:
// 猴子选大王问题,用数组来解决

#include<stdio.h>
void main()
{
    int temp[100];
    int n;      // 存放猴子总数(不要大于99)
    int m;      // 报数的最大值
    int i;      // 循环体计数变量
    int out;    // 记录出局的猴子数
    int count;  // 记录当前报数

    // 直接录入数据了,没有进行录入检错。。。
    fprintf(stdout, "请输入猴子总数:\n");
    fscanf(stdin, "%d", &n);
    fprintf(stdout, "请输入报数最大值:\n");
    fscanf(stdin, "%d", &m);

    // 初始化
    for (i = 1; i <= n; i++) // 从temp[1]到temp[n]易理解
    {
        temp[i] = 1;
    }
    count = 0;
    out = 0;

    // 这是计数过程,最终只剩下一个猴子。
    for (i = 1; out != n - 1; i++)
    {
        if (n + 1 == i)
        { // 循环计数的基础
            i = 1;
        }
        if (1 == temp[i])
        { // 查到没出局的猴子,报数加1
            count++;
        }
        if (count == m)
        { // 碰到出局猴子,0表示出局,出局数加1,重新报数
            temp[i] = 0;
            out++;
            count = 0; 
        }
    }

    // 输出每个猴子状态,便于验证
    for (i = 1; i <= n; i++)
    {
        fprintf(stdout, "%-4d", temp[i]);
        if (i % 10 == 0)
        {
            putchar(10);
        }
    }
    putchar(10);

    // 输出结果
    for (i = 1; temp[i] != 1; i++)
    {
    }
    fprintf(stdout, "猴王是第%d只猴子。\n", i);
}



[ 本帖最后由 神机军师 于 2014-4-12 01:25 编辑 ]

未知令人期待!
2014-04-12 01:24
fragileeye
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:107
专家分:387
注 册:2011-5-21
得分:0 
回复 10楼 lol1234
你的思维乱了,我改了,你再看看
2014-04-12 01:39
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
得分:1 
约瑟夫问题我没怎么研究过,我根据那个题目自己写了程序,供你参考:
程序代码:
#include <stdio.h>

int main()
{
    int i,m,n,z,counter=1;
    int a[50];

    printf("输入猴子数n(不大于50)和报数终止数m(不小于2)\n");
    scanf("%d%d",&n,&m);
    z=n;

    for(i=0;i<n;i++)
    {
        a[i]=1;
    }

    while(z!=1)
    {
        for(i=0;i<n;i++)
        {
            if(a[i] != 0)
            {
                a[i] = counter++;
            } 

            if(a[i] == m)
            {
                a[i] = 0;
                counter = 1;
                z--;
                break;
            }
        }
    }

    for(i=0;i<n;i++)
    {
        if(a[i]!=0)
        {
            printf("猴子大王是第 %d 个\n",i+1);
        }
    }
}

2014-04-12 10:21
lol1234
Rank: 1
等 级:新手上路
帖 子:46
专家分:3
注 册:2014-4-11
得分:0 
回复 15楼 Andrew_Lee
谢谢你!我修改了一下,加了检录 太谢谢你了!   谢谢各位出力的大牛~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2014-04-12 14:35
lol1234
Rank: 1
等 级:新手上路
帖 子:46
专家分:3
注 册:2014-4-11
得分:0 
回复 13楼 神机军师
恩恩  你的是对的!我用了你的!修改了一下  我把fprintf之类的全换成了printf,然后加了检录    我是初学者 用的vc6 老师也没教fprintf  我想问问可以替换么?我替换了可以正常使用
2014-04-12 14:38
lol1234
Rank: 1
等 级:新手上路
帖 子:46
专家分:3
注 册:2014-4-11
得分:0 
回复 13楼 神机军师
int temp[10000];
    int n;      
    int m;      
    int i;     
    int out;   
    int count;  
    printf("请输入猴子总数(猴子超过1万只)\n");
    scanf("%d",&n);


我还想问问,数组a[i]中,i不能是变量,万一我的猴子有一千万怎么办?
2014-04-12 14:40
lol1234
Rank: 1
等 级:新手上路
帖 子:46
专家分:3
注 册:2014-4-11
得分:0 
回复 15楼 Andrew_Lee
我还想问问,数组a[i]中,i不能是变量,万一我的猴子有一千万怎么办?
2014-04-13 17:45
szyzln
Rank: 2
来 自:湖南张家界
等 级:论坛游民
帖 子:21
专家分:39
注 册:2013-8-31
得分:1 
回复 19楼 lol1234
个人理解:
a[i]其中的i不能是变量,这是规定。如果是变量,编译器在编译时无法为数组a分配空间。
要么你在代码中做输入约束,不能大于某个值。
要么你在头文件最上面typedef I 10000  。类似于弄个全局变量

支持Linux开源精神
2014-04-13 18:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-429976-1-1.html




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

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