能力值:
( LV2,RANK:10 )
2 楼
是不是说得不够清楚啊???
能力值:
( LV2,RANK:10 )
3 楼
大整数的四则运算问题,分开存,分开算
能力值:
( LV2,RANK:10 )
4 楼
楼上的兄弟,能否详细说明一下。。我用笨方法,用EXCEL电子表格,做好公式,然后一个一个数输入,结果发现,工作量真不是一般的大啊。。。
能力值:
( LV2,RANK:10 )
5 楼
你们能指点指点我吗
能力值:
( LV2,RANK:10 )
6 楼
新建一个html文件,复制以下内容. 只要输入的机器码符合XXXXXXXXXX(10位)-XXXXX(5位)-XXXX(4位)-XXXX,且全为数字,就能运算出正确结果!
<script type="text/javascript">
function result()
{
var num=document.getElementById("key").value;
var n=num.split("-");
var str=0;
str=n[0]*n[1]+parseInt(n[2])-100;
document.getElementById("result").innerHTML=str;
}
</script>
<input type="text" id="key" ><input type="button" onclick="result();" value="计算" /><span id="result"></span>
能力值:
( LV2,RANK:10 )
7 楼
楼上的兄弟啊。。。现在是计算结果已经能得到,主要是通过计算的结果,逆向计算出符合此结果的注册码啊。。XXXXXXXXXX(10位)-XXXXX(5位)-XXXX(4位)-XXXX这个格式的内容并非机器码,而是未知的注册码。。。
能力值:
( LV2,RANK:10 )
8 楼
以这么些条件来算注册码,写的循环,我直接死机
能力值:
( LV2,RANK:10 )
9 楼
。。。。。。不是这么夸张吧。。。
能力值:
( LV2,RANK:10 )
10 楼
传说中的穷举法?
能力值:
( LV2,RANK:10 )
11 楼
以你提供的条件和我的智商
我只能写出
for (var i=1000000000;i<=9999999999 ;i++ )
{
for (var j=10000;j<=99999 ;j++ )
{
for (var k=1000;k<=9999 ;k++ )
{
if (parseInt(i*j+k-100)==str)
{
result=result+"<br/>";
}
}
}
}
这样的循环来计算注册码
我都没敢点,IE肯定死
能力值:
( LV2,RANK:10 )
12 楼
。。。。我有个思路啊,首先定位那个4位数的数值,随便输入一个4位数都行,然后再进行计算,这样不是能省很多事吗?
能力值:
( LV2,RANK:10 )
13 楼
在OD里分析算法吧.我还在汇编的初级阶段,帮不了你
能力值:
( LV2,RANK:10 )
14 楼
4位是小事,真正占资源的是10位的
能力值:
( LV2,RANK:10 )
15 楼
你贴个完整的java程序出来。。我试试看,麻烦你了
能力值:
( LV2,RANK:10 )
16 楼
复制到html文件里就可以执行了
<script type="text/javascript">
function result()
{
var num=document.getElementById("key").value;
var n=num.split("-");
var str=0;
var result="KEY:<br/>";
str=n[0]*n[1]+parseInt(n[2])-100;
document.getElementById("result").innerHTML=str;
for (var i=1000000000;i<=9999999999 ;i++ )
{
for (var j=10000;j<=99999 ;j++ )
{
for (var k=1000;k<=9999 ;k++ )
{
if (parseInt(i*j+k-100)==str)
{
result=result+parseChar(i)+parseChar(j)+parseChar(k)+"0000<br/>";
}
}
}
}
document.getElementById("code").innerHTML=result;
}
</script>
<input type="text" id="key" ><input type="button" onclick="result();" value="Make Key" /><span id="result"></span>
<p id="code">
</p>
能力值:
( LV2,RANK:10 )
17 楼
诺维司机了。。。唉。。。虽然知道有这个结果。。但还是。。。。
能力值:
( LV9,RANK:170 )
18 楼
之前的代码我是在要发表的时候更新了一下,结果还给整错了.影响兄弟看了.
重发一个,附件里是源代码,还有结果.
procedure TForm1.Button1Click(Sender: TObject);
var
A,C,D1,Sum:int64;
B:Longword;
S:string;
F:TextFile;
begin
randomize;
Sum:=195120126921530;
D1:=Sum;
assignfile(F,'Result.txt');
rewrite(F);
for B:=10000 to 99999 do
begin
A:=D1 div B;
S:=inttostr(A);
if Length(S)=10 then
begin
C:=(D1 mod B)+100;
if (Length(inttostr(C))=4) then
writeln(F,inttostr(A)+'-'+inttostr(B)+'-'+inttostr(C)+'-XXXX');
end;
end;
closefile(F);
showMessage('OK')
end;
上传的附件:
能力值:
(RANK:260 )
19 楼
将注册码的格式计为
X10-Y5-Z4-0000
算法要求 X10 x Y5 + ( Z4 - 100 ) == 195120126921530(大数)
X10 x Y5 = 195120126921530 + 100 - Z4
Z4的范围是0000-9999
X10 x Y5 的允许范围,是15位十进制数,拿LZ给的例子来说,1.95 E 14,要大数进行因数分解,难度比较大,但穷举的计算量也太多了,不过也是可能的。
那么X10是10位数,最大值用1e10来估算,那么Y5的最小值可以用1.95e4来估算,那么算法可以从1.95e4开始到1e5进行遍历,用1.95e14整除得到另一个因子,相乘后再与原始大数求差,看这个差是否小于9999,是的话,便是一解。
从大约1.95e4到1e5,穷举次数大约是8万多次,应该能跑下来吧。。。
计算中用到的15位数,32位无符号数不够,可以用64位整数,或者使用相关的数学库中的大数库。 我简单写个试试,如果测试通过了一会再贴下来。
能力值:
( LV2,RANK:10 )
20 楼
楼上的nig大哥:附件中第一组数据:9999494025-19513-5214-XXXX
套用公式:9999494025×19513=195120126909825
195120126909825+(5214-100)=195120126914939 再验证第二个:9998469224-19515-8679-XXXX
9998469224×19515=195120126906360
195120126906360+(8679-100)=195120126914939
呃。。这个结果和195120126921530 是差一点
我用delphi验证了一下:在得到的'Result.txt'文件中
第一组数据为: 9999494025-19513-8448-XXXX
9999494025×19513=195120126909825
195120126909825+(8448-100)=195120126918173
第二组数据为:9996932417-19518-3267-XXXX
9996932417×19513=195070142252921
195070142252921+(3267-100)=195070142256088
这个。。。我搞不懂啊。。。
能力值:
( LV2,RANK:10 )
21 楼
嗯,是这个意思。。。。
能力值:
(RANK:260 )
22 楼
找到了,算法有效,我从调试器中直接修改变量的值,找到一组值,满足LZ所说的条件,不知道正确否,我找到的数据是:
9997956903-19516-2682-xxxx
9997956903 x 19516 + 2682 - 100 == 195120126921530
代码简单贴一下:
// main.cpp #include <stdio.h> // C++输入输出流无法处理64位整数,使用C式的scanf和printf
int main()
{
__int64 BigNumber=0,x10,y5,z4; // 所有数据使用相同数据类型,提高编译器代码生成效率
__try
{
printf("%s","输入大数:\n");
scanf("%I64d",&BigNumber);
printf("输入的数据是:%I64d\n",BigNumber);
BigNumber += 100; for ( y5 = BigNumber / 10000000000; y5 < 100000; ++y5 )
{
x10 = BigNumber / y5;
z4 = BigNumber - x10 * y5 ;
if ( z4 <= 9999 )
{
printf("%s","貌似找到一组:\n");
printf("%I64d-%I64d-%I64d-xxxx\n",x10,y5,z4);
return 0;
}
}
printf("%s","算法失败\n");
}
__except(0)
{
printf("%s","程序异常\n");
return -1;
}
return 0;
}
能力值:
(RANK:260 )
23 楼
顶起来,yalansi兄弟看到后回个,验算一下
能力值:
(RANK:260 )
24 楼
再顶起来!!!
我将小程序改动了一下,现在可以穷举所有的结果,代码就不贴了,因为算法没变,只是用了C++的标准容器来放结果数据,现在附上我生成的结果,共16476个结果,没有全部验证,但写个验证程序我想大家都会,就不献丑了。我随机选了3个结果手工验证了一下,算法没问题。
请LZ告知一下正确与否
上传的附件:
能力值:
( LV2,RANK:10 )
25 楼
嗯,看到了。。。现在卡在我认为无关紧要的后四位,泪奔中。。。。我再啃啃,把条件啃出来先