能力值:
( LV15,RANK:2473 )
|
-
-
2 楼
好像有个memset(buf,0,n)写错了
长度应该是n*sizeof(int)
|
能力值:
( LV9,RANK:180 )
|
-
-
3 楼
不知对不对
sessiondiy
idnoisse
|
能力值:
( LV15,RANK:3306 )
|
-
-
4 楼
输入上面的直接卡死。。
|
能力值:
( LV9,RANK:180 )
|
-
-
5 楼
你没看程序?
|
能力值:
( LV9,RANK:180 )
|
-
-
6 楼
看来楼主得解释一下了
一种是ccfer讲的状况
一种是我认为他故意的状况
不过楼主有说这是一种算法, ccfer讲的较有可能.
|
能力值:
( LV15,RANK:3306 )
|
-
-
7 楼
前一種情況吧
|
能力值:
( 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好像都有问题
|
能力值:
( LV9,RANK:180 )
|
-
-
9 楼
被忽悠的感觉很差
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
晕死 怪不得会算法到一半死了
|
能力值:
( LV9,RANK:180 )
|
-
-
11 楼
我是把他视为未初始化的mem不得参于运算
给他小jmp一下
|
能力值:
( LV15,RANK:3306 )
|
-
-
12 楼
额,这都行。。
|
能力值:
( LV13,RANK:760 )
|
-
-
13 楼
 ccfer讲得不错,我写好以后就发现这问题,但来不及修改,昨天睡得早 
还有一个问题,就是如果输入同一个字符的话就很简单,这个问题我也一并将其修改了,
大家一起来做数学游戏吧,这是一个著名的经典“XXXX”。
谁能指出XXXX是什么?
|
能力值:
( LV9,RANK:180 )
|
-
-
14 楼
你做事还真是负责啊
|
能力值:
( LV13,RANK:760 )
|
-
-
15 楼
呵呵,没办法,有师傅sessiondiy在,我哪敢不负责啊!
|
能力值:
( LV9,RANK:180 )
|
-
-
16 楼
太难了
等我二年
|
能力值:
( LV13,RANK:760 )
|
-
-
17 楼
呵呵,不是吧,你说的是反话吧?
|
能力值:
( LV9,RANK:180 )
|
-
-
18 楼
只知道游戏. 原来排棋子也有名字
约瑟夫环
|
能力值:
( LV3,RANK:30 )
|
-
-
19 楼
建议 sessiondiy 申报当 unpack cm 区版主
|
能力值:
( LV9,RANK:490 )
|
-
-
20 楼
CNN刚刚出的消息:sessiondiy进了FBI的黑名单,据说原因是知道的太多。
|
能力值:
( 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!");
}
|
能力值:
( LV9,RANK:180 )
|
-
-
22 楼
petnt那个太复杂了
我连OD都没用上. 只能看着F5猜他在玩什么.
|
能力值:
( LV9,RANK:180 )
|
-
-
23 楼
你这句话有争议
你自己追码吧.
你并不是如正常玩法般的常见取最后一个, 而是取最后第2个.
不要再说你又写错了
|
能力值:
( LV9,RANK:490 )
|
-
-
24 楼
第一次用VC++,可能是简单的事让我整复杂了。
本来用VC++的初衷就是他的代码复杂,可当花指令用。
用汇编写的话上下一拉,所有代码就看完了。
|
能力值:
( LV13,RANK:760 )
|
-
-
25 楼
 确实是a1+1个小孩,我又写错了 
将while(m>1)修改为
while(m>0)即为一般的约瑟夫环求解。
|
|
|