约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈...,输出一次出圈的人的编号。
#include <iostream>
using namespace std;
bool a[101];
int main(){
int n,m;
cin>>n>>m;
cout<<endl;
for(int i=1;i<=n;++i) a[i]=false;
int f=0,t=0,s=0;
do
{
++t;
if(t==n+1) t=1;
if(a[t]==false) ++s;
if(s==m)
{s=0;
cout<<t<<" ";
a[t]=true;
++f;
}
}while(f!=n);
return 0;
}
memset(a,0,sizeof(a)):为所有数组里的元素赋值为0。
第t个位置有人的话,报数。
判断报的数是否为M,若是M,则这个元素赋值1,即出圈,要从0开始报数。
直到人全部出圈,即出圈人数f=n。
这道题目需要搞清楚有多少变量,需要多少变量。人数和M,位置t,人数f,以及报的数值s。
当人在圈里,报数+1,位置+1,直到报数等于题目要求的M,报数计0,位置继续加1,这个位置改变数值为1...依次循环。当循环一圈即t=n+1,重新开始t=1。
#include <iostream>
using namespace std;
const int n=10;
int a[n+1];
int main(){
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n-1;++i)
for(int j=1;j<=n-i;++j)
if(a[j]<a[j+1]) swap(a[j],a[j+1]);
for(int i=1;i<=n;++i) cout<<" "<<a[i];
cout<<endl;
return 0;
}
①用循环输入数组
②从a[1]到a[10],相邻的数两两比较
③每次比较时,大的数在后面的话就交换。
④第一轮n-1次循环,把最小数排到最后,第二轮同样把第二小排到右边第二个,以此类推。