首页
社区
课程
招聘
[求助]求一个公式的算法,请会编程的兄弟帮帮忙!
发表于: 2008-4-15 22:43 7440

[求助]求一个公式的算法,请会编程的兄弟帮帮忙!

2008-4-15 22:43
7440
一个类似13471425498-14484-8598-21的机器码
通过这样的计算:13471425498×14484=195120126913032
                        195120126913032+(8598-100)=195120126921530
得到最终结果:195120126921530

而注册码的格式为:XXXXXXXXXX(10位)-XXXXX(5位)-XXXX(4位)-XXXX (这个无关紧要)
通过同样的计算方式,要求得到的值也为:195120126921530

小弟编程基础比较差。。还请大家帮忙!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (30)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是说得不够清楚啊???
2008-4-15 23:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大整数的四则运算问题,分开存,分开算
2008-4-15 23:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼上的兄弟,能否详细说明一下。。我用笨方法,用EXCEL电子表格,做好公式,然后一个一个数输入,结果发现,工作量真不是一般的大啊。。。
2008-4-15 23:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你们能指点指点我吗
2008-4-16 00:01
0
雪    币: 200
活跃值: (10)
能力值: ( 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>
2008-4-16 00:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼上的兄弟啊。。。现在是计算结果已经能得到,主要是通过计算的结果,逆向计算出符合此结果的注册码啊。。XXXXXXXXXX(10位)-XXXXX(5位)-XXXX(4位)-XXXX这个格式的内容并非机器码,而是未知的注册码。。。
2008-4-16 00:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
以这么些条件来算注册码,写的循环,我直接死机
2008-4-16 00:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
。。。。。。不是这么夸张吧。。。
2008-4-16 00:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
传说中的穷举法?
2008-4-16 00:32
0
雪    币: 200
活跃值: (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肯定死
2008-4-16 00:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
。。。。我有个思路啊,首先定位那个4位数的数值,随便输入一个4位数都行,然后再进行计算,这样不是能省很多事吗?
2008-4-16 00:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
在OD里分析算法吧.我还在汇编的初级阶段,帮不了你
2008-4-16 00:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
4位是小事,真正占资源的是10位的
2008-4-16 00:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你贴个完整的java程序出来。。我试试看,麻烦你了
2008-4-16 00:43
0
雪    币: 200
活跃值: (10)
能力值: ( 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>
2008-4-16 00:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
诺维司机了。。。唉。。。虽然知道有这个结果。。但还是。。。。
2008-4-16 00:54
0
雪    币: 413
活跃值: (752)
能力值: ( 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;
上传的附件:
2008-4-16 09:26
0
雪    币: 2110
活跃值: (21)
能力值: (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位整数,或者使用相关的数学库中的大数库。

我简单写个试试,如果测试通过了一会再贴下来。
2008-4-16 10:46
0
雪    币: 200
活跃值: (10)
能力值: ( 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

这个。。。我搞不懂啊。。。
2008-4-16 10:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
嗯,是这个意思。。。。
2008-4-16 11:12
0
雪    币: 2110
活跃值: (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;
}
2008-4-16 12:19
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
23
顶起来,yalansi兄弟看到后回个,验算一下
2008-4-16 12:47
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
24
再顶起来!!!
我将小程序改动了一下,现在可以穷举所有的结果,代码就不贴了,因为算法没变,只是用了C++的标准容器来放结果数据,现在附上我生成的结果,共16476个结果,没有全部验证,但写个验证程序我想大家都会,就不献丑了。我随机选了3个结果手工验证了一下,算法没问题。

请LZ告知一下正确与否
上传的附件:
2008-4-16 13:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
嗯,看到了。。。现在卡在我认为无关紧要的后四位,泪奔中。。。。我再啃啃,把条件啃出来先
2008-4-16 13:36
0
游客
登录 | 注册 方可回帖
返回
//