首页
社区
课程
招聘
[原创]一道经典的数学题,这下不是小学生题了哈!~~~
发表于: 2009-2-16 17:17 8894

[原创]一道经典的数学题,这下不是小学生题了哈!~~~

2009-2-16 17:17
8894
  无聊,看这论坛人气也下降不少,故辛苦一下,出个数学题,大家来做吧,嘿嘿
  反正是研究算法,我也不搞复杂了,要破的连十秒钟都要不到就能成功(绝不是假话!)
  今天早上赶紧将错误处修正,不过将比较的方式也一并修正了 ,你们现在知道是什么算法了吗?
  早上改动有三:
  1、改正内存数据初始化的缺陷。
  2、禁止输入相同的字串,如aaaa,bbbb等。
  3、将直接明码比较改成XX比较,呵呵,大家来一起做游戏吧!
  

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (27)
雪    币: 8209
活跃值: (4559)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
2
好像有个memset(buf,0,n)写错了
长度应该是n*sizeof(int)
2009-2-16 18:05
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
不知对不对
sessiondiy
idnoisse
2009-2-16 18:31
0
雪    币: 30331
活跃值: (8834)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
4
输入上面的直接卡死。。
2009-2-16 20:17
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
5
你没看程序?
2009-2-16 20:45
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
看来楼主得解释一下了
一种是ccfer讲的状况
一种是我认为他故意的状况
不过楼主有说这是一种算法, ccfer讲的较有可能.
2009-2-16 20:58
0
雪    币: 30331
活跃值: (8834)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
7
前一種情況吧
2009-2-16 21:03
0
雪    币: 233
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
//004015AE
void init_heap(char* heap,int pace,int len) //pace为步幅
{
  for(int x =0;x<len;x++) //这里认为堆空间有len个byte的数据
    heap[x] = 0;           //问题出在这里,一部分没有初始化
    
///////////////////////////而下面认为堆空间有len个DWORD数据
int cPace =0,Index=0;
///////////////////////////试图在空间中寻找len个值为0的DWORD单元,并赋值1
//4015DA                 //但是值为0的单元不够了,进入死循环
  for(int cLen=len;cLen>1;cPace++,Index++)
  {
    if(heap[Index*4]==1)   
      cPace--;
    
    if(cPace==pace)
      {
        cLen--;
        heap[Index*4] =1;
        cPace=0;
      }
      
      if(Index==len)
        Index=0;
                  
  }
}

今天运气不好,CrackMe好像都有问题
2009-2-16 22:55
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
9
被忽悠的感觉很差
2009-2-16 23:02
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
晕死 怪不得会算法到一半死了
2009-2-16 23:05
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
11
我是把他视为未初始化的mem不得参于运算
给他小jmp一下
2009-2-16 23:11
0
雪    币: 30331
活跃值: (8834)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
12
额,这都行。。
2009-2-16 23:18
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
13
ccfer讲得不错,我写好以后就发现这问题,但来不及修改,昨天睡得早
还有一个问题,就是如果输入同一个字符的话就很简单,这个问题我也一并将其修改了,
大家一起来做数学游戏吧,这是一个著名的经典“XXXX”。
  谁能指出XXXX是什么?
2009-2-17 08:00
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
14
你做事还真是负责啊
2009-2-17 09:29
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
15
呵呵,没办法,有师傅sessiondiy在,我哪敢不负责啊!
2009-2-17 09:45
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
16
太难了
等我二年
2009-2-17 09:53
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
17
呵呵,不是吧,你说的是反话吧?
2009-2-17 10:39
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
18
只知道游戏. 原来排棋子也有名字
约瑟夫环
2009-2-17 12:48
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
建议 sessiondiy 申报当 unpack  cm 区版主
2009-2-17 13:05
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
20
CNN刚刚出的消息:sessiondiy进了FBI的黑名单,据说原因是知道的太多。
2009-2-17 13:11
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
21
  不错,你知道是约瑟夫环就证明已经解开这道题了!
下面公布下算法吧:
  将用户名长度设定为A(A>=10),A个小孩围成1圈,然后报数B(1<B<=A-1),到B的字母将会出局,取最后留下的小孩a1。
  然后再次报数B1(2<B1<=A-1),取最后留下的小孩a2,以此类推,直到Bn(n=A-1),留下小孩an。
  最后将a1至an对应的用户名字符与用户输入的字符逐个比较,任一一个字母不对都会出局,呵呵,这就是约瑟夫环算法的模拟。
  算法源代码附上:
void CMathDlg::OnOK()
{
        // TODO: Add extra validation here
        UpdateData(TRUE); //m_sUer和m_sCode为输入的用户名及注册码
        if (m_sUser.GetLength() < 10 || m_sCode.GetLength() < m_sUser.GetLength()-2) return;
        for(int i=0; i< m_sUser.GetLength()-1; i++)
        {
                for (int j=i+1; j<= m_sUser.GetLength()-1; j++)
                {
                        if (m_sUser.GetAt(i)-m_sUser.GetAt(j) == 0) return;
                }
        }
        calc_code();
        //CDialog::OnOK();
}

int johnsf(int m, int n) //n为当前报的数
{
        int p_tmp = 0, p_n = 0, N = m;
        //p_tmp 当前指到的人 p_n从1数到n之间的数
        BOOL *person = new BOOL[m]; //来几个小孩,我们就提供装几个小孩的场地
        memset(person, 0, m*sizeof(BOOL));
        while (m > 1) //当前做游戏的人数为m
        {
                p_n ++;
                p_tmp ++;
                if ( person[p_tmp-1] == true) p_n--; //如果已经出局的就不数他了
                if (n == p_n)
                {
                        person[p_tmp-1] = true; //否则数到n就出局吧:)
                        m--;
                        p_n = 0;
                }
                if ( N == p_tmp) p_tmp = 0;
        }
        delete person; //游戏做完,收工
        return p_tmp+1;
}

void CMathDlg::calc_code()
{
        CString s, s1;
        int i, *p;
        p = new int[m_sUser.GetLength()-2]; //第1和所有小孩数不会用来作为报数的n
        for (i=1; i < m_sUser.GetLength()-1; i++)
                p[i-1] = johnsf(m_sUser.GetLength(), i+1); //从2到m-1开始做游戏
        for ( i = 0; i< m_sUser.GetLength()-2; i++)
        {        //逐字符比较,这里用的是减法,用其他方法也行,增加点破解难度
                if (m_sUser.GetAt(p[i]-1)-m_sCode.GetAt(i) != 0) return;
        }
        delete p;
        AfxMessageBox("good job, congratulations!");
}
2009-2-17 13:17
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
22
petnt那个太复杂了
我连OD都没用上. 只能看着F5猜他在玩什么.
2009-2-17 14:00
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
23
你这句话有争议
你自己追码吧.
你并不是如正常玩法般的常见取最后一个, 而是取最后第2个.

不要再说你又写错了
2009-2-17 14:04
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
24
第一次用VC++,可能是简单的事让我整复杂了。
本来用VC++的初衷就是他的代码复杂,可当花指令用。
用汇编写的话上下一拉,所有代码就看完了。
2009-2-17 14:08
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
25
  确实是a1+1个小孩,我又写错了
 将while(m>1)修改为
 while(m>0)即为一般的约瑟夫环求解。
2009-2-17 14:32
0
游客
登录 | 注册 方可回帖
返回