华为机试--删数

一、问题描述

二、算法分析

这是一个约瑟夫环问题,解法一:STL 库

  1. int JosephusProblem_Solution1(int n, int m)  
  2. {  
  3.     if(n < 1 || m < 1)  
  4.         return -1;  
  5.   
  6.     list<int> listInt;  
  7.     unsigned i;  
  8.     //初始化链表  
  9.     for(i = 0; i < n; i++)  
  10.         listInt.push_back(i);  
  11.   
  12.     list<int>::iterator iterCurrent = listInt.begin();  
  13.     while(listInt.size() > 1)  
  14.     {  
  15.         //前进m - 1步  
  16.         for(i = 0; i < m-1; i++)  
  17.         {  
  18.             if(++iterCurrent == listInt.end())  
  19.                 iterCurrent = listInt.begin();  
  20.         }  
  21.         //临时保存删除的结点  
  22.         list<int>::iterator iterDel = iterCurrent;  
  23.         if(++iterCurrent == listInt.end())  
  24.             iterCurrent = listInt.begin();  
  25.         //删除结点  
  26.         listInt.erase(iterDel);  
  27.     }  
  28.   
  29.     return *iterCurrent;  
  30. }  
解法二、推导法

int main()
{
    int total  = 0;
    cout << "Please input total number of people : ";
    cin >> total;
 
    int number = 0;
    cout << "Please input selected number : ";
    cin >> number;
 
    /* If number = 3
     * f(1) = 0
     * f(2) = 1 = (f(1) + 3) % 2
     * f(3) = 1 = (f(2) + 3) % 3
     * f(4) = 0 = (f(3) + 3) % 4
     * f(5) = 3 = (f(4) + 3) % 5
     * ...
     * f(n) = x = (f(n-1) + 3) % n
     * */
 
    int last = 0; // f(1) = 0
    for(int i = 2; i <= total; ++i)
    {
        last = (last + number) % i;
    }
    cout << "The last one is : " << last + 1 << endl;
 
    return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值