看来这个问题不是很难,我将此问题转贴到csdn,很快就有了结果(与Forcal一致):http://topic.csdn.net/u/20100113/07/1bff0e7a-f8e1-4a48-9d59-ff5e8656b9ec.html?94423
下面是Forcal代码。 算法很简单:穷举,同时去掉没有必要的循环。
大家看还能否优化?同时检查一下这种算法有没有遗漏其他解?
看有没有更好的算法?
- main(:A,i,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18,s)=
- {
- A="\[19]",
- i=1,(i<=1).while{setw(A+i,i++)}, //Unicode静态字符数组初始化
- i=0,
- i1=1,(i1<=16).while{
- setw(A+i1,0), //setw(A+i1,0)将地址A+i1的单元置0
- i2=1,(i2<=18).while{
- if[!getw(A+i2),i2++,continue()], //getw(A+i2)得到地址A+i2的单元的值
- setw(A+i2,0),
- i3=1,(i3<=18).while{
- if[!getw(A+i3),i3++,continue()],
- if{i1/[which(i3<=9,i2*10,i2*100)+i3]>=1,i3++,continue()},
- setw(A+i3,0),
- i4=1,(i4<=18).while{
- if[!getw(A+i4) | getw(A+i4)<i1,i4++,continue()], //单元A+i4为0时不能进入循环;getw(A+i4)<i1时不进入循环,可去掉重复解
- setw(A+i4,0),
- i5=1,(i5<=18).while{
- if[!getw(A+i5),i5++,continue()],
- setw(A+i5,0),
- i6=1,(i6<=18).while{
- if[!getw(A+i6),i6++,continue()],
- if{i1/[which(i3<=9,i2*10,i2*100)+i3]+i4/[which(i6<=9,i5*10,i5*100)+i6]>=1,i6++,continue()}, //which是一个选择计算函数
- setw(A+i6,0),
- i7=1,(i7<=18).while{
- if[!getw(A+i7) | getw(A+i7)<i4,i7++,continue()],
- setw(A+i7,0),
- i8=1,(i8<=18).while{
- if[!getw(A+i8),i8++,continue()],
- setw(A+i8,0),
- i9=1,(i9<=18).while{
- if[!getw(A+i9),i9++,continue()],
- if{abs{i1/[which(i3<=9,i2*10,i2*100)+i3]+i4/[which(i6<=9,i5*10,i5*100)+i6]+i7/[which(i9<=9,i8*10,i8*100)+i9]-1}>1e-12,i9++,continue()},
- setw(A+i9,0),
- i10=1,(i10<=18).while{
- if[!getw(A+i10),i10++,continue()],
- setw(A+i10,0),
- i11=1,(i11<=18).while{
- if[!getw(A+i11),i11++,continue()],
- setw(A+i11,0),
- i12=1,(i12<=18).while{
- if[!getw(A+i12),i12++,continue()],
- setw(A+i12,0),
- i13=1,(i13<=18).while{
- if[!getw(A+i13) | getw(A+i13)<i10,i13++,continue()],
- setw(A+i13,0),
- i14=1,(i14<=18).while{
- if[!getw(A+i14),i14++,continue()],
- setw(A+i14,0),
- i15=1,(i15<=18).while{
- if[!getw(A+i15),i15++,continue()],
- s=i10/[which(i12<=9,i11*10,i11*100)+i12]+i13/[which(i15<=9,i14*10,i14*100)+i15],
- if{s<=0.5,i15++,continue()},
- setw(A+i15,0),
- //
- i16=1,(i16<=18).while{if[getw(A+i16),break()],i16++},
- i17=i16+1,(i17<=18).while{if[getw(A+i17),break()],i17++},
- i18=i17+1,(i18<=18).while{if[getw(A+i18),break()],i18++},
- if{abs{s-i16/[which(i18<=9,i17*10,i17*100)+i18]-0.5}<1e-12, i++,
- printff{"{1,i,3}{2,i,3}{3,i,3}{4,i,3}{5,i,3}{6,i,3}{7,i,3}{8,i,3}{9,i,3}{10,i,3}{11,i,3}{12,i,3}{13,i,3}{14,i,3}{15,i,3}{16,i,3}{17,i,3}{18,i,3}\r\n",i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18}
- },
- if{abs{s-i16/[which(i17<=9,i18*10,i18*100)+i17]-0.5}<1e-12, i++,
- printff{"{1,i,3}{2,i,3}{3,i,3}{4,i,3}{5,i,3}{6,i,3}{7,i,3}{8,i,3}{9,i,3}{10,i,3}{11,i,3}{12,i,3}{13,i,3}{14,i,3}{15,i,3}{16,i,3}{17,i,3}{18,i,3}\r\n",i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i18,i17}
- },
- if{abs{s-i17/[which(i16<=9,i18*10,i18*100)+i16]-0.5}<1e-12, i++,
- printff{"{1,i,3}{2,i,3}{3,i,3}{4,i,3}{5,i,3}{6,i,3}{7,i,3}{8,i,3}{9,i,3}{10,i,3}{11,i,3}{12,i,3}{13,i,3}{14,i,3}{15,i,3}{16,i,3}{17,i,3}{18,i,3}\r\n",i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i17,i18,i16}
- },
- if{abs{s-i17/[which(i18<=9,i16*10,i16*100)+i18]-0.5}<1e-12, i++,
- printff{"{1,i,3}{2,i,3}{3,i,3}{4,i,3}{5,i,3}{6,i,3}{7,i,3}{8,i,3}{9,i,3}{10,i,3}{11,i,3}{12,i,3}{13,i,3}{14,i,3}{15,i,3}{16,i,3}{17,i,3}{18,i,3}\r\n",i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i17,i16,i18}
- },
- if{abs{s-i18/[which(i17<=9,i16*10,i16*100)+i17]-0.5}<1e-12, i++,
- printff{"{1,i,3}{2,i,3}{3,i,3}{4,i,3}{5,i,3}{6,i,3}{7,i,3}{8,i,3}{9,i,3}{10,i,3}{11,i,3}{12,i,3}{13,i,3}{14,i,3}{15,i,3}{16,i,3}{17,i,3}{18,i,3}\r\n",i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i18,i16,i17}
- },
- if{abs{s-i18/[which(i16<=9,i17*10,i17*100)+i16]-0.5}<1e-12, i++,
- printff{"{1,i,3}{2,i,3}{3,i,3}{4,i,3}{5,i,3}{6,i,3}{7,i,3}{8,i,3}{9,i,3}{10,i,3}{11,i,3}{12,i,3}{13,i,3}{14,i,3}{15,i,3}{16,i,3}{17,i,3}{18,i,3}\r\n",i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i18,i17,i16}
- },
- //
- setw(A+i15,i15++)
- },
- setw(A+i14,i14++)
- },
- setw(A+i13,i13++)
- },
- setw(A+i12,i12++)
- },
- setw(A+i11,i11++)
- },
- setw(A+i10,i10++)
- },
- setw(A+i9,i9++)
- },
- setw(A+i8,i8++)
- },
- setw(A+i7,i7++)
- },
- setw(A+i6,i6++)
- },
- setw(A+i5,i5++)
- },
- setw(A+i4,i4++)
- },
- setw(A+i3,i3++)
- },
- setw(A+i2,i2++)
- },
- setw(A+i1,i1++) //setw(A+i1,i1++)将地址A+i1的单元置i1,然后i1++
- },
- i //解的个数
- };
复制代码 |