请指出下面C++程序的错误(约瑟夫环有n个人杀第m个,求最后剩的那个)

#include<stdio.h>#defineN1000intmain(){inta[N],i,j,n,m,sum=0,b,c=0;scanf("sum%d\n",&n... #include<stdio.h>
#define N 1000
int main()
{
int a[N],i,j,n,m,sum=0,b,c=0;
scanf("sum%d\n",&n);
scanf("kill%d",&m);

for(i=0;i<n;i++)
{
a[i]=1;
}
for(i=0;i<n;i++)
{
sum+=a[i];
if(sum%m==0)
{
a[i]=0;
b=i;
}
if(i=n-1)
i=0;
for(j=0;j<n;j++)
c+=a[j];
if(c==0)
break;
}
printf("%d\n",b);
return 0;

}
展开
 我来答
忘至白葬不情必0T
2011-11-10 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:90%
帮助的人:1.2亿
展开全部
一些小错误。
1、for循环可以这样写for(i=0;i<n;i=(i+1)%n)
2、每出杀一个人,最好把sum清0。如果用sum%m==0来判断,那么有可能某次杀了序号为k的人后,k+1之前已死,那么下一个循环sum+=a[k],sum的值不变,sum%m==0仍旧成立。
3、检查是否杀完不用那么复杂,还搞个循环来加,直接用c表示已杀人数,当c==n时停止就行了
4、最后b别忘了加1,因为数组下标是从0开始。

#include<stdio.h>
#define N 1000
int main()
{
int a[N],i,j,n,m,sum=0,b,c=0;
scanf("sum%d\n",&n);
scanf("kill%d",&m);

for(i=0;i<n;i++)
{
a[i]=1;
}
for(i=0;i<n;i=(i+1)%n)
{
sum+=a[i];
if(sum==m)
{
a[i]=0;
b=i;
c++;
sum=0;
}
if(c==n)
break;
}
printf("%d\n",b+1);
return 0;

}
terranlong
2011-11-10 · TA获得超过7294个赞
知道大有可为答主
回答量:2660
采纳率:0%
帮助的人:4006万
展开全部
首先楼主的是C的代码,第二这根本没做出个约瑟夫环出来,只从0循环到n,就一次是绝对不可能最后剩下一个人的,可以用我以下的代码
#include <iostream>
#include <list>
using namespace std;

int main()
{
int num, i, t, m;
cout << "人数:";
cin >> num;
cout << "m: ";
cin >> m;
list<int> ilist;
for (i = 1; i <= num; ++i)
{
ilist.push_back(i);
}
list<int>::iterator p = ilist.begin();
list<int>::iterator q = ilist.begin();
for (; q != ilist.end(); ++q)
{
cout << *q;
}
cout << "\t------- 玩家列队,从" << *(ilist.begin()) << "号开始报数" << endl;
while (ilist.size() > 1)
{
for (i = 1; i != m; ++i)
{
p++;
if (p == ilist.end())
{
p = ilist.begin();
}
}
list<int>::iterator tm = p;
tm++;
if (tm == ilist.end())
{
tm = ilist.begin();
}
t = *p;
ilist.erase(p);
p = tm;
if (ilist.size() > 1)
{
for (q = ilist.begin(); q != ilist.end(); ++q)
{
cout << *q;
}
cout << "\t------- " << t << "号被淘汰,从" << *p << "号开始报数" << endl;
}
else
{
cout << *p;
cout << "\t------- " << t << "号被淘汰," << *p << "号为最后赢家!" << endl;
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
不允许再盗用
2011-11-12
知道答主
回答量:4
采纳率:0%
帮助的人:3.3万
展开全部
一些小错误。
1、for循环可以这样写for(i=0;i<n;i=(i+1)%n)
2、每出杀一个人,最好把sum清0。如果用sum%m==0来判断,那么有可能某次杀了序号为k的人后,k+1之前已死,那么下一个循环sum+=a[k],sum的值不变,sum%m==0仍旧成立。
3、检查是否杀完不用那么复杂,还搞个循环来加,直接用c表示已杀人数,当c==n时停止就行了
4、最后b别忘了加1,因为数组下标是从0开始。

#include<stdio.h>
#define N 1000
int main()
{
int a[N],i,j,n,m,sum=0,b,c=0;
scanf("sum%d\n",&n);
scanf("kill%d",&m);

for(i=0;i<n;i++)
{
a[i]=1;
}
for(i=0;i<n;i=(i+1)%n)
{
sum+=a[i];
if(sum==m)
{
a[i]=0;
b=i;
c++;
sum=0;
}
if(c==n)
break;
}
printf("%d\n",b+1);
return 0;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式