C++约瑟夫环问题,题目要求输出最后一个人的编号,并且要允许多组数据的输入和输出
4个回答
展开全部
//#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;
}
#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);
}
}
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代替了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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;
}
}
}
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;
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这个是简单的吧?等下我电脑网络好了给你写一个。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询