主题:请高手指教
lml1996
[专家分:30] 发布于 2007-06-07 20:36:00
输入1~41之间的任一奇数N,在1 2 3 4 5 6 7 8 9=N这个式中填入“+”或“-”,使得等式成立 。[em39]
最好能把算法也写出来,谢谢了。
回复列表 (共4个回复)
沙发
moz [专家分:37620] 发布于 2007-06-07 21:22:00
1. 遍历: 也就是说,把所有可能可以允许的情形都列举一次,然后计算式子的值,检查是否满足要求.
2. 根据式子的特点,最大值,最小值,差值,要求值,自己想一想怎么处理,查找,以及还原.
板凳
moz [专家分:37620] 发布于 2007-06-07 21:43:00
最大值 1+2+......+9=45 (全部是加号)
如果有一个减号,则减号后面的数将会被45减两次,得出结果.
如果要求N, (45-N)/2
所得之数就是减号后面的数的和.就看哪几个数的和 = (45-N)/2 了
也可以根据数值大小遍历所得,(这时候遍历的范围就小得多了).
3 楼
Matodied [专家分:7560] 发布于 2007-06-07 21:46:00
CLS
INPUT n
DIM a(8)
FOR i1 = 0 TO 1: a(1) = 1 - i1 * 2
FOR i2 = 0 TO 1: a(2) = 1 - i2 * 2
FOR i3 = 0 TO 1: a(3) = 1 - i3 * 2
FOR i4 = 0 TO 1: a(4) = 1 - i4 * 2
FOR i5 = 0 TO 1: a(5) = 1 - i5 * 2
FOR i6 = 0 TO 1: a(6) = 1 - i6 * 2
FOR i7 = 0 TO 1: a(7) = 1 - i7 * 2
FOR i8 = 0 TO 1: a(8) = 1 - i8 * 2
GOSUB calc
IF s = n THEN GOSUB pri
NEXT i8, i7, i6, i5, i4, i3, i2, i1
END
calc:
s = 1
FOR i = 1 TO 8
s = s + a(i) * (i + 1)
NEXT i
RETURN
pri:
PRINT 1;
FOR i = 1 TO 8
IF a(i) = 1 THEN PRINT "+"; ELSE PRINT "-";
PRINT i + 1;
NEXT i
PRINT
RETURN
你是只要一个算式,还是要所有符合条件的算式?
上面是输出所有算式的程序,如果你只要一个算式,就把倒数第2行的PRINT改为END。
算法:
先定义一个数组a(8),a(i)用来表示第i个空当填“+”还是“-”,值为1表示填“+”,值为-1表示填“-”。输入n。搞8个循环,分别确定a数组的值。然后调用计算的子程序calc,计算时只要用目前的结果s加上a(i)乘以i+1的值,计算8次后判断结果与n是否相等,相等就输出算式。
当然,n的绝对值必须是奇数,而且要在-43-45范围内,否则就没有结果。
4 楼
a292982250 [专家分:40] 发布于 2007-06-13 13:34:00
给我打高分
我来回复