C++约瑟夫环问题,题目要求输出最后一个人的编号,并且要允许多组数据的输入和输出

例如,输入是621248300输出应为517求帮忙,谢谢!... 例如,输入是
6 2
12 4
8 3
0 0

输出应为
5
1
7

求帮忙,谢谢!
展开
 我来答
White_MouseYBZ
2015-08-16 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6767万
展开全部
//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdlib.h"
#include <iostream>
using namespace std;
int main(void){
int i,j,k,M,S,x,*p;
while(1){
cout << "Please input M(int M>0) & S(int S>0)...\n";
if(cin >> M >> S,M==0 && S==0)
break;
if(M>0 && S>0 ){
if(p=new int[M],p){
for(i=0;i<M;p[i]=1+i++);
for(x=M-1,k=j=i=0;k<M;i<x ? i++ : i=0)
if(p[i]!=0 && ++j==S){
p[i]=j=0;
k++;
}
cout << "The last one is the No." << (i ? i : M) << endl;
delete [M]p;
}
else{
cout << "Application memory failure...";
exit(0);
}
}
else cout << "Error,redo: ";
}
cout << endl;
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
推荐于2016-10-20
展开全部
#include <iostream>
using namespace std;

int n,m,ans;

int main()
{
while (scanf("%d%d",&n,&m))
{
ans=0; if (n+m==0) return 0;
for (int i=1;i<=n;i++) ans=(ans+m)%i;
printf("%d\n",ans%n+1);
}
}
更多追问追答
追问
你这个代码不对。。。
追答
你给的三个样例都通过了啊,可以给出问题的数据吗?

我简单的解释一下这给代码吧。(先定义一下人的位置从0开始标号)
这样考虑,一开始有n个人站成一圈,从第一个人开始报数,报到m的人出列。
接下去相当于有n-1个人站成一圈,从第m+1个人开始报数,到m的出列,这是一个子问题,只不过每个人的位置从i变到了 (i+m)%n,设f[n]表示n个人报数是出去的人的标号,那么就有f[n]=(f[n-1]+m)%n。
然后f[n]其实不用存,我给出的代码中用ans代替了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小嘿动漫
2015-08-27
知道答主
回答量:4
采纳率:100%
帮助的人:4866
展开全部
#include<stdio.h>
int main(void)
{
int a[1000];
int n,m,i,j=0,t;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
a[i]=i;
while(1)
{
for(i=1;i<=n;i++)
{
if(a[i]) {j++;printf("(%2d) ",a[i]);}
if(j%m==0&&a[i]!=0)
{
printf(" %2d\n",a[i]);
t=a[i];
a[i]=0;
}
}
if(j==m*n)
{
printf("最后胜利的人是:%d号\n",t);
break;
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
缘分天空恋
2015-08-16
知道答主
回答量:18
采纳率:0%
帮助的人:9.9万
展开全部
你这个是简单的吧?等下我电脑网络好了给你写一个。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式