C++程序疑问

选举猴王问题:N只猴子围成一圈,顺序编号1至N。从编号为1的猴子开始依次报数,报数m的猴子就退出圈子,接着再报,报数m的猴子再退出圈子,依次继续下去,圈子最后所剩的一只猴... 选举猴王问题:N 只猴子围成一圈,顺序编号1至N。从编号为1的猴子开始依次报数,报数m 的猴子就退出圈子,接着再报,报数m 的猴子再退出圈子,依次继续下去,圈子最后所剩的一只猴子为猴王,它原先的编号是几?
我的思路是:
1) 使用一维数组存放猴子从1到n的编号,定义参加选举猴王的最多猴子数为40。
2) i为每次循环时计数变量,k为按1,2,3,…m报数时的计数变量,t表示退出的猴子数。依次将退出的猴子对应的数组元素置0,直到只剩下一只猴子。
3) 找出数组中不为0的a[i],输出该数。
写出的程序:
#include<iostream>
using namespace std;
void main()
{
int a[41],i=0,k=0,n=0,m=0,t=0;
cout<<"请输入参选的猴子数n和所报数m:";
cin>>n>>m;
for(i=1;i<=n;i++)
a[i]=i;
i=m;
for(t=0;t<n;)
{
for(k=i,t=0;k<=n;k=k+m)
a[k]=0,t++;
i=k/n;
}
for(i=1;i<=n;i++)
if(a[i]!=0)
k=i;
cout<<"猴王为:"<<k<<"号"<<endl;
}
我知道第三个for中的k=k+m错了,但不知道怎么改。求大神指点。
展开
 我来答
百度网友21a360264
2014-05-18 · TA获得超过1855个赞
知道小有建树答主
回答量:640
采纳率:100%
帮助的人:355万
展开全部

思路没问题,但考虑不周,编码时细节出错。最主要是不能用k=k+m的算法,经过多轮循环之后,已经有很多猴子退出了,那么k和k+m之间剩下的不可能还是m只猴子了,事实上需要一只一只猴子查是还在圈子中还是退出了。

另外i=k/n,LZ自己能说清楚这是什么吗?

然后,C语言的计数系统(包括下标)都是从0开始的,自然语言和其他一些像VB语言是从1开始的,计数和循环的初值是0是1,最后判断表达式是用小于还是小于等于,LZ需要揣摩一下,如果要认真掌握C,最好适应一下从0开始的方式。

以下给的是第二个for大循环的代码

k=1;    // 猴子下标,根据 LZ 从 1 开始的
for(t=0; t<n-1; )    // 要退出的是 n-1 只猴子,不是 n 只
{
    for(i=0; i<m; )    // i 报数,报到 m 退出内循环,表示找到一只该退出的猴子
    {
        if(k>n)        // k 猴子下标,这个使 k 超过 n 之后从 1 继续
            k = 1;
        if(a[k]==0)    // 猴子 a[k] 早已退出,跳过
            k++;
        else
            i++;        // 报数 + 1
    }
    a[k] = 0;   // 让猴子 a[k] 退出。
    t++;    // 退出猴子数 + 1
}
追问
如果a【k】!=0,则i++,开始报下一个数,可是这时候判断的还是上一个猴子
追答

哦,Sorry!你是对的,报数完了,每次k都要进到下一个的

k=1;    // 猴子下标,根据 LZ 从 1 开始的
for(t=0; t<n-1; )    // 要退出的是 n-1 只猴子,不是 n 只
{
    for(i=0; i<m; )    // i 报数,报到 m 退出内循环,表示找到一只该退出的猴子
    {
        if(k>n)        // k 猴子下标,这个使 k 超过 n 之后从 1 继续
            k = 1;
        //if(a[k]==0)    // 猴子 a[k] 早已退出,跳过
        //    k++;
        if(a[k]!=0)
            i++;        // 报数 + 1
        k++;
    }
    a[k-1] = 0;   // 让猴子 a[k-1] 退出,注意前面的 k++ 使退出的下标变成 k-1 了。
    t++;    // 退出猴子数 + 1
}
Timsqinc33ed
2014-05-18 · TA获得超过633个赞
知道小有建树答主
回答量:516
采纳率:0%
帮助的人:82万
展开全部
你的m都没有变··改什么··
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式