请指出下面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;
} 展开
#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;
} 展开
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、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;
}
展开全部
首先楼主的是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;
}
}
}
#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;
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一些小错误。
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、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;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询