- 注册时间
- 2008-2-6
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 51573
- 在线时间
- 小时
|
发表于 2008-10-2 15:39:51
|
显示全部楼层
暂时用Delphi语言写的- program minn;
-
- {$APPTYPE CONSOLE}
-
- uses
- SysUtils, StrUtils, windows;
-
- var
- EndNum: integer = 0;
- AddNum: integer = -1;
- SubNum: integer = -2;
- MulNum: integer = -3;
-
- type
- sExpr = record
- mask: integer;
- result: integer; //可能为负数,只能计算到12
- Expr: array[0..23] of integer;
- end;
-
- var
- num: integer; //输入数字
- appPath: string;
- numStr: array[0..15] of string[2];
- mask: array[0..15] of integer;
-
- procedure Init;
- var
- i: integer;
- begin
- numStr[0] := '00';
- numStr[1] := '01';
- numStr[2] := '02';
- numStr[3] := '03';
- numStr[4] := '04';
- numStr[5] := '05';
- numStr[6] := '06';
- numStr[7] := '07';
- numStr[8] := '08';
- numStr[9] := '09';
- numStr[10] := '10';
- numStr[11] := '11';
- numStr[12] := '12';
- numStr[13] := '13';
- numStr[14] := '14';
- numStr[15] := '15';
- mask[0] := 1;
- for I := 1 to 15 do
- mask[i] := mask[i-1] shl 1;
- end;
-
- //两个都是单数字
- procedure processTwoStep;
- var
- sFile: File of sExpr;
- i, j, fs: integer;
- sSFile, prefix: string;
- sSExpr: sExpr;
- begin
- prefix := appPath + numStr[num];
- sSFile := prefix + '02.dat';
- AssignFile(sFile, sSFile);
- Reset(sFile);
- fs := FileSize(sFile);
- Seek(sFile, fs);
- for i := 1 to num - 1 do
- for j := i + 1 to num do
- begin
- sSExpr.mask := mask[i] or mask[j];
- sSExpr.result := i + j;
- ssExpr.Expr[0] := AddNum;
- sSExpr.Expr[1] := i;
- sSExpr.Expr[2] := j;
- ssExpr.Expr[3] := EndNum;
- Write(sFile, sSExpr);
-
- sSExpr.Expr[0] := SubNum;
- sSExpr.result := i - j;
- Write(sFile, sSExpr);
-
- sSExpr.Expr[0] := MulNum;
- sSExpr.result := i * j;
- Write(sFile, sSExpr);
-
- sSExpr.result := j - i;
- sSExpr.Expr[0] := SubNum;
- sSExpr.Expr[1] := j;
- sSExpr.Expr[2] := i;
- sSExpr.Expr[3] := EndNum;
- Write(sFile, sSExpr);
- end;
-
- Close(sFile);
- end;
-
- //有一个是单数字
- procedure processSingleStep(m: integer);
- var
- mFile, sFile: File of sExpr;
- n, i, fs: integer;
- sMFile, sSFile, prefix: string;
- sMExpr, sSExpr: sExpr;
- begin
- prefix := appPath + numStr[num];
- sMFile := prefix + numStr[m] + '.dat';
- sSFile := prefix + numStr[m + 1] + '.dat';
- AssignFile(mFile, sMFile);
- AssignFile(sFile, sSFile);
- Reset(sFile);
- fs := FileSize(sFile);
- Seek(sFile, fs);
- for n := 1 to num do
- begin
- reset(mFile);
- while not eof(mFile) do
- begin
- Read(mFile, sMExpr);
- if (mask[n] and sMExpr.mask = 0) then
- begin
- sSExpr.mask := mask[n] or sMExpr.mask;
- sSExpr.result := n + sMExpr.result;
- sSExpr.Expr[1] := n;
- for I := 0 to 2 * m - 2 do
- sSExpr.Expr[2 + i] := sMExpr.Expr[i];
- sSExpr.Expr[0] := AddNum;
- sSExpr.Expr[1 + 2 * m] := EndNum;
- Write(sFile, sSExpr);
-
- sSExpr.Expr[0] := SubNum;
- sSExpr.result := n - sMExpr.result;
- Write(sFile, sSExpr);
-
- sSExpr.Expr[0] := MulNum;
- sSExpr.result := n * sMExpr.result;
- Write(sFile, sSExpr);
-
- sSExpr.result := sMExpr.result - n;
- for I := 1 to 2 * m - 1 do
- sSExpr.Expr[i] := sMExpr.Expr[i - 1];
- sSExpr.Expr[2 * m] := n;
- sSExpr.Expr[0] := SubNum;
- Write(sFile, sSExpr);
- end;
- end;
- end;
-
- Close(mFile);
- Close(sFile);
- end;
-
- //两个都是序列表达式
- procedure processDoubleStep(n, m: integer);
- var
- nFile, mFile, sFile: File of sExpr;
- fs, i: integer;
- sNFile, sMFile, sSFile, prefix: string;
- sNExpr, sMExpr, sSExpr: sExpr;
- begin
- prefix := appPath + numStr[num];
- sNFile := prefix + numStr[n] + '.dat';
- sMFile := prefix + numStr[m] + '.dat';
- sSFile := prefix + numStr[n + m] + '.dat';
- AssignFile(nFile, sNFile);
- AssignFile(mFile, sMFile);
- reset(nFile);
- AssignFile(sFile, sSFile);
- reset(sFile);
- fs := FileSize(sFile);
- Seek(sFile, fs);
- while not eof(nFile) do
- begin
- Read(nFile, sNExpr);
- reset(mFile);
- while not eof(mFile) do
- begin
- Read(mFile, sMExpr);
- if (sNExpr.mask and smExpr.mask = 0) then
- begin
- sSExpr.mask := sNExpr.mask or sMExpr.mask;
- sSExpr.result := sNExpr.result + sMExpr.result;
- for I := 1 to 2 * n - 1 do
- sSExpr.Expr[i] := sNExpr.Expr[i - 1];
- for I := 0 to 2 * m - 2 do
- sSExpr.Expr[2 * n + i] := sMExpr.Expr[i];
- sSExpr.Expr[0] := AddNum;
- sSExpr.Expr[2 * n + 2 * m - 1] := EndNum;
- Write(sFile, sSExpr);
-
- sSExpr.Expr[0] := SubNum;
- sSExpr.result := sNExpr.result - sMExpr.result;
- Write(sFile, sSExpr);
-
- sSExpr.Expr[0] := MulNum;
- sSExpr.result := sNExpr.result * sMExpr.result;
- Write(sFile, sSExpr);
-
- sSExpr.result := sMExpr.result - sNExpr.result;
- for I := 1 to 2 * m - 1 do
- sSExpr.Expr[i] := sMExpr.Expr[i - 1];
- for I := 0 to 2 * n - 2 do
- sSExpr.Expr[2 * m + i] := sNExpr.Expr[i];
- sSExpr.Expr[0] := SubNum;
- Write(sFile, sSExpr);
- end;
- end;
- end;
-
- Close(nFile);
- Close(mFile);
- Close(sFile);
- end;
-
- procedure processStep(l: integer);
- var
- i: integer;
- sFile: File of sExpr;
- sSFile, prefix: string;
- begin
- prefix := appPath + numStr[num];
- sSFile := prefix + numStr[l] + '.dat';
- AssignFile(sFile, sSFile);
- rewrite(sFile);
- Close(sFile);
-
- if (l = 2) then
- processTwoStep;
- if (l >= 3) then
- processSingleStep(l - 1);
- if (l >= 4) then
- for i := 2 to l div 2 do
- processDoubleStep(i, l - i);
- end;
-
- var
- i: integer;
- begin
- { TODO -oUser -cConsole Main : Insert code here }
- appPath := ExtractFilePath(paramStr(0));
- writeln('请输入需要求出数据的num值: ');
- readln(num);
- Init;
- for i := 2 to num do
- processStep(i);
- end.
-
复制代码 |
|