找回密码
 欢迎注册
楼主: mathe

[擂台] 最小无法表达的正整数

[复制链接]
发表于 2008-10-2 10:32:02 | 显示全部楼层
失望了
刚去学校
才算到35万多个表达式
看来,越来越难出新的
冲突的概率在增大啊
所以估计至少需要10天甚至50天才能出结果
而这么多天不停电的概率太小了
这个程序很难保存当前状态以避免中断

暂时没停止
希望出现奇迹
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-2 10:34:06 | 显示全部楼层
我想至少如果实现了那个以文件存储且仅考虑加减乘的程序
应该能实现保存状态持续计算的

但似乎这个东西有点复杂哦

mathe能估算下对应10的文件存储需求么?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-2 15:33:33 | 显示全部楼层
2008-10-02  15:12               416     0202.dat
2008-10-02  15:12             1,248     0302.dat
2008-10-02  15:12             4,992     0303.dat
2008-10-02  15:12             2,496     0402.dat
2008-10-02  15:12            19,968     0403.dat
2008-10-02  15:12           119,808     0404.dat
2008-10-02  15:12             4,160     0502.dat
2008-10-02  15:12            49,920     0503.dat
2008-10-02  15:12           599,040     0504.dat
2008-10-02  15:12         3,194,880     0505.dat
2008-10-02  15:12             6,240     0602.dat
2008-10-02  15:12            99,840     0603.dat
2008-10-02  15:12         1,797,120     0604.dat
2008-10-02  15:12        19,169,280     0605.dat
2008-10-02  15:13       124,600,320     0606.dat
2008-10-02  15:13             8,736     0702.dat
2008-10-02  15:13           174,720     0703.dat
2008-10-02  15:13         4,193,280     0704.dat
2008-10-02  15:14        67,092,480     0705.dat
2008-10-02  15:15       872,202,240     0706.dat
携带所有信息的记录,每个长度104字节,0707的出现错误,怀疑是文件太大了,在3.4G大小后异常结束
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-2 15:39:51 | 显示全部楼层
暂时用Delphi语言写的
  1. program minn;

  2. {$APPTYPE CONSOLE}

  3. uses
  4.   SysUtils, StrUtils, windows;

  5. var
  6.   EndNum: integer = 0;
  7.   AddNum: integer = -1;
  8.   SubNum: integer = -2;
  9.   MulNum: integer = -3;

  10. type
  11.   sExpr = record
  12.     mask: integer;
  13.     result: integer; //可能为负数,只能计算到12
  14.     Expr: array[0..23] of integer;  
  15.   end;

  16. var
  17.   num: integer; //输入数字
  18.   appPath: string;
  19.   numStr: array[0..15] of string[2];
  20.   mask: array[0..15] of integer;

  21. procedure Init;
  22. var
  23.   i: integer;
  24. begin
  25.   numStr[0] := '00';
  26.   numStr[1] := '01';
  27.   numStr[2] := '02';
  28.   numStr[3] := '03';
  29.   numStr[4] := '04';
  30.   numStr[5] := '05';
  31.   numStr[6] := '06';
  32.   numStr[7] := '07';
  33.   numStr[8] := '08';
  34.   numStr[9] := '09';
  35.   numStr[10] := '10';
  36.   numStr[11] := '11';
  37.   numStr[12] := '12';
  38.   numStr[13] := '13';
  39.   numStr[14] := '14';
  40.   numStr[15] := '15';
  41.   mask[0] := 1;
  42.   for I := 1 to 15 do
  43.     mask[i] := mask[i-1] shl 1;  
  44. end;

  45. //两个都是单数字
  46. procedure processTwoStep;
  47. var
  48.   sFile: File of sExpr;
  49.   i, j, fs: integer;
  50.   sSFile, prefix: string;
  51.   sSExpr: sExpr;
  52. begin
  53.   prefix := appPath + numStr[num];
  54.   sSFile := prefix + '02.dat';
  55.   AssignFile(sFile, sSFile);
  56.   Reset(sFile);
  57.   fs := FileSize(sFile);
  58.   Seek(sFile, fs);
  59.   for i := 1 to num - 1 do
  60.     for j := i + 1 to num do
  61.       begin
  62.         sSExpr.mask := mask[i] or mask[j];
  63.         sSExpr.result := i + j;
  64.         ssExpr.Expr[0] := AddNum;
  65.         sSExpr.Expr[1] := i;
  66.         sSExpr.Expr[2] := j;
  67.         ssExpr.Expr[3] := EndNum;
  68.         Write(sFile, sSExpr);

  69.         sSExpr.Expr[0] := SubNum;
  70.         sSExpr.result := i - j;
  71.         Write(sFile, sSExpr);

  72.         sSExpr.Expr[0] := MulNum;
  73.         sSExpr.result := i * j;
  74.         Write(sFile, sSExpr);

  75.         sSExpr.result := j - i;
  76.         sSExpr.Expr[0] := SubNum;
  77.         sSExpr.Expr[1] := j;
  78.         sSExpr.Expr[2] := i;
  79.         sSExpr.Expr[3] := EndNum;
  80.         Write(sFile, sSExpr);
  81.       end;

  82.   Close(sFile);
  83. end;

  84. //有一个是单数字
  85. procedure processSingleStep(m: integer);
  86. var
  87.   mFile, sFile: File of sExpr;
  88.   n, i, fs: integer;
  89.   sMFile, sSFile, prefix: string;
  90.   sMExpr, sSExpr: sExpr;
  91. begin
  92.   prefix := appPath + numStr[num];
  93.   sMFile := prefix + numStr[m] + '.dat';
  94.   sSFile := prefix + numStr[m + 1] + '.dat';
  95.   AssignFile(mFile, sMFile);
  96.   AssignFile(sFile, sSFile);
  97.   Reset(sFile);
  98.   fs := FileSize(sFile);
  99.   Seek(sFile, fs);
  100.   for n := 1 to num do
  101.   begin
  102.     reset(mFile);
  103.     while not eof(mFile) do
  104.     begin
  105.       Read(mFile, sMExpr);
  106.       if (mask[n] and sMExpr.mask = 0) then
  107.       begin
  108.         sSExpr.mask := mask[n] or sMExpr.mask;
  109.         sSExpr.result := n + sMExpr.result;
  110.         sSExpr.Expr[1] := n;
  111.         for I := 0 to 2 * m - 2 do
  112.           sSExpr.Expr[2 + i] := sMExpr.Expr[i];
  113.         sSExpr.Expr[0] := AddNum;
  114.         sSExpr.Expr[1 + 2 * m] := EndNum;
  115.         Write(sFile, sSExpr);

  116.         sSExpr.Expr[0] := SubNum;
  117.         sSExpr.result := n - sMExpr.result;
  118.         Write(sFile, sSExpr);

  119.         sSExpr.Expr[0] := MulNum;
  120.         sSExpr.result := n * sMExpr.result;
  121.         Write(sFile, sSExpr);

  122.         sSExpr.result := sMExpr.result - n;
  123.         for I := 1 to 2 * m - 1 do
  124.           sSExpr.Expr[i] := sMExpr.Expr[i - 1];
  125.         sSExpr.Expr[2 * m] := n;
  126.         sSExpr.Expr[0] := SubNum;
  127.         Write(sFile, sSExpr);
  128.       end;
  129.     end;
  130.   end;

  131.   Close(mFile);
  132.   Close(sFile);
  133. end;

  134. //两个都是序列表达式
  135. procedure processDoubleStep(n, m: integer);
  136. var
  137.   nFile, mFile, sFile: File of sExpr;
  138.   fs, i: integer;
  139.   sNFile, sMFile, sSFile, prefix: string;
  140.   sNExpr, sMExpr, sSExpr: sExpr;
  141. begin
  142.   prefix := appPath + numStr[num];
  143.   sNFile := prefix + numStr[n] + '.dat';
  144.   sMFile := prefix + numStr[m] + '.dat';
  145.   sSFile := prefix + numStr[n + m] + '.dat';
  146.   AssignFile(nFile, sNFile);
  147.   AssignFile(mFile, sMFile);
  148.   reset(nFile);
  149.   AssignFile(sFile, sSFile);
  150.   reset(sFile);
  151.   fs := FileSize(sFile);
  152.   Seek(sFile, fs);
  153.   while not eof(nFile) do
  154.   begin
  155.     Read(nFile, sNExpr);
  156.     reset(mFile);
  157.     while not eof(mFile) do
  158.     begin
  159.       Read(mFile, sMExpr);
  160.       if (sNExpr.mask and smExpr.mask = 0) then
  161.       begin
  162.         sSExpr.mask := sNExpr.mask or sMExpr.mask;
  163.         sSExpr.result := sNExpr.result + sMExpr.result;
  164.         for I := 1 to 2 * n - 1 do
  165.           sSExpr.Expr[i] := sNExpr.Expr[i - 1];
  166.         for I := 0 to 2 * m - 2 do
  167.           sSExpr.Expr[2 * n + i] := sMExpr.Expr[i];
  168.         sSExpr.Expr[0] := AddNum;
  169.         sSExpr.Expr[2 * n + 2 * m - 1] := EndNum;
  170.         Write(sFile, sSExpr);

  171.         sSExpr.Expr[0] := SubNum;
  172.         sSExpr.result := sNExpr.result - sMExpr.result;
  173.         Write(sFile, sSExpr);

  174.         sSExpr.Expr[0] := MulNum;
  175.         sSExpr.result := sNExpr.result * sMExpr.result;
  176.         Write(sFile, sSExpr);

  177.         sSExpr.result := sMExpr.result - sNExpr.result;
  178.         for I := 1 to 2 * m - 1 do
  179.           sSExpr.Expr[i] := sMExpr.Expr[i - 1];
  180.         for I := 0 to 2 * n - 2 do
  181.           sSExpr.Expr[2 * m + i] := sNExpr.Expr[i];
  182.         sSExpr.Expr[0] := SubNum;
  183.         Write(sFile, sSExpr);
  184.       end;
  185.     end;
  186.   end;

  187.   Close(nFile);
  188.   Close(mFile);
  189.   Close(sFile);
  190. end;

  191. procedure processStep(l: integer);
  192. var
  193.   i: integer;
  194.   sFile: File of sExpr;
  195.   sSFile, prefix: string;
  196. begin
  197.   prefix := appPath + numStr[num];
  198.   sSFile := prefix + numStr[l] + '.dat';
  199.   AssignFile(sFile, sSFile);
  200.   rewrite(sFile);
  201.   Close(sFile);

  202.   if (l = 2) then
  203.     processTwoStep;
  204.   if (l >= 3) then
  205.     processSingleStep(l - 1);
  206.   if (l >= 4) then
  207.     for i := 2 to l div 2 do
  208.       processDoubleStep(i, l - i);
  209. end;

  210. var
  211.   i: integer;
  212. begin
  213.   { TODO -oUser -cConsole Main : Insert code here }
  214.   appPath := ExtractFilePath(paramStr(0));
  215.   writeln('请输入需要求出数据的num值: ');
  216.   readln(num);
  217.   Init;
  218.   for i := 2 to num do
  219.     processStep(i);  
  220. end.

复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-2 17:57:10 | 显示全部楼层
我倾向于只保存小文件.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-2 19:51:14 | 显示全部楼层


你的意思是只保存数值,不保存表达式?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-2 21:14:57 | 显示全部楼层
这个自然,不然保存的信息太多了.
而如果对于一个数值,要计算对应的表达式,只要将匹配的数值逆向再计算一次就应该能够比较快速的找出表达式(可以用来检测程序运行的正确性),但是通常情况没有必要产生这些表达式
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-2 23:05:00 | 显示全部楼层
28 = (2 * 3 + 1)  * 4

对n=4
(1+2)*3*4=36

//////////////////////////////////////////////////
对任意的n(n>2)能够表达的最大整数为
(1+2)*3*4*...*n
如果能够证明,其能够连续表达出1~(1+2)*3*4*...*n的数
那么(1+2)*3*4*...*n+1 就是这个最小正整数
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-2 23:16:02 | 显示全部楼层
不过用1~n这n个数通过四则混合运算表达出来的正整数
最多只可能有 4的(n-1)次方的,在n较大的情况下是远小于 (1+2)*3*4*...*n的
所以,楼主的答案必在1~(1+2)*3*4*...*n之间
有难度
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-2 23:27:12 | 显示全部楼层
不过用1~n这n个数通过四则混合运算表达出来的正整数
最多只可能有 4的(n-1)次方的,

/////////////////////////////////////
这个结论不对,还要考虑括号的情况
那么最大可能有 (4的(n-1)次方)*(n-1)! >(1+2)*3*4*...*n

(4的(n-1)次方)*(n-1)!  

/////////////////////////////////////////////////////
对任意的n(n>2)能够表达的最大整数为
(1+2)*3*4*...*n
如果能够证明,其能够连续表达出1~(1+2)*3*4*...*n的数
那么(1+2)*3*4*...*n+1 就是这个最小正整数

这条路可能才是王道阿,考虑一下
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-18 14:44 , Processed in 0.043703 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表