约瑟夫问题-经典算法,冒泡排序

约瑟夫问题: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次循环,把最小数排到最后,第二轮同样把第二小排到右边第二个,以此类推。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值