回 帖 发 新 帖 刷新版面

主题:请高手指教

输入1~41之间的任一奇数N,在1 2 3 4 5 6 7 8 9=N这个式中填入“+”或“-”,使得等式成立 。[em39]
    最好能把算法也写出来,谢谢了。

回复列表 (共4个回复)

沙发

1. 遍历: 也就是说,把所有可能可以允许的情形都列举一次,然后计算式子的值,检查是否满足要求.

2. 根据式子的特点,最大值,最小值,差值,要求值,自己想一想怎么处理,查找,以及还原.

板凳

最大值  1+2+......+9=45 (全部是加号)
如果有一个减号,则减号后面的数将会被45减两次,得出结果.
如果要求N, (45-N)/2
所得之数就是减号后面的数的和.就看哪几个数的和 = (45-N)/2 了
也可以根据数值大小遍历所得,(这时候遍历的范围就小得多了).

3 楼

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 楼

给我打高分

我来回复

您尚未登录,请登录后再回复。点此登录或注册