主题:[讨论]求助:一道题
JRX
[专家分:180] 发布于 2006-08-08 11:24:00
设有数2,3,5,7,13,运算符号+,-,*,且运算符号无优先级之分,如2+3*5=25,3*5+2=17.现给出任意一个整数N,要求用以上数和运算符,以最少的运算次数产生出N
例如:N=7, 7=7 0次运算
N=93 93=13*7+2 2次运算
回复列表 (共3个回复)
沙发
淡淡的 [专家分:2030] 发布于 2006-08-17 20:21:00
原题没有"可重复使用"的字样,但考虑任给整数N,所以按可重复使用处理的。
'1。这里列出了200以内的部分数的算法。
'2。改变数组下标,1处的3,2处的200,就可以找出更多的数的算法.
'3。你可以按需要编写输出。2006.08.08
Private Sub Command1_click()
Dim a(100000), aa(100000), b(100000), bb(100000), c(100000)
n = InputBox("请输入数字")
n = Val(n)
c(2) = "2": c(3) = "3": c(5) = "5": c(7) = "7": c(13) = "13"
bb(1) = "2": bb(2) = "3": bb(3) = "5": bb(4) = "7": bb(5) = "13"
b(1) = 2: b(2) = 3: b(3) = 5: b(4) = 7: b(5) = 13
k = 5: f = 0
Cls
If c(n) <> "" Then Print n; "="; n: Print
For i = 1 To 3 '1---
For j = 1 To k: a(j) = b(j): aa(j) = bb(j): Next j
For j = 1 To k
x = 2: Call uu(a, j, x, c, f, b, bb, aa, n)
x = 3: Call uu(a, j, x, c, f, b, bb, aa, n)
x = 5: Call uu(a, j, x, c, f, b, bb, aa, n)
x = 7: Call uu(a, j, x, c, f, b, bb, aa, n)
x = 13: Call uu(a, j, x, c, f, b, bb, aa, n)
Next j
k = f: f = 0
Next i
For i = 1 To 200 '2----
Print Tab(o * 25); i; "="; c(i);
o = o + 1
If i = Int(i / 5) * 5 Then Print: o = 0
Next i
End Sub
Sub uu(a, j, x, c, f, b, bb, aa, n)
d = a(j) + x
If c(d) = "" Then
f = f + 1
b(f) = d
bb(f) = aa(j) + "+" + Str(x)
c(d) = bb(f)
If d = n Then Print n; "="; c(n): Print
End If
d = a(j) * x
If c(d) = "" Then
f = f + 1
b(f) = d
bb(f) = aa(j) + "*" + Str(x)
c(d) = bb(f)
If d = n Then Print n; "="; c(n): Print
End If
d = a(j) - x
If d > 0 Then
If c(d) = "" Then
f = f + 1
b(f) = d
bb(f) = aa(j) + "-" + Str(x)
c(d) = bb(f)
If d = n Then Print n; "="; c(n): Print
End If
End If
End Sub
板凳
moz [专家分:37620] 发布于 2006-08-18 13:10:00
你那数组的确很利害。
这就是有钱人的特征。
DECLARE FUNCTION fena$ (b%)
DEFINT A-Z
DIM SHARED n,a
n = 5
input a
dim shared sz$(a+170),s(n)
s(1) = 13
s(2) = 7
s(3) = 5
s(4) = 3
s(5) = 2
FOR i = 1 TO n
sz$(s(i)) = LTRIM$(STR$(s(i)))
FOR j = 1 TO n
sz$(s(i) + s(j)) = LTRIM$(STR$(s(i))) + "+" + LTRIM$(STR$(s(j)))
sz$(s(i) * s(j)) = LTRIM$(STR$(s(i))) + "*" + LTRIM$(STR$(s(j)))
NEXT j, i
sz$(1)="3-2"
PRINT a; "="; fena(a)
end
FUNCTION fena$ (b)
IF b = 0 THEN EXIT FUNCTION
IF b < a THEN
IF sz$(b) <> "" THEN
fena$ = sz$(b)
EXIT FUNCTION
END IF
END IF
FOR i = 1 TO n
IF b > s(i) THEN
c = b \ s(i) + 1
d = c * s(i) - b
e$ = fena$(c) + "*" + LTRIM$(STR$(s(i)))
IF d > 0 THEN e$ = e$ + "-" + fena$(d)
IF en$ = "" THEN en$ = e$
IF LEN(e$) < LEN(en$) THEN en$ = e$
c = c - 1
d = b - c * s(i)
e$ = fena$(c) + "*" + LTRIM$(STR$(s(i)))
IF d > 0 THEN e$ = e$ + "+" + fena$(d)
IF en$ = "" THEN en$ = e$
IF LEN(e$) < LEN(en$) THEN en$ = e$
END IF
NEXT
sz$(b)= en$
fena$ = en$
END FUNCTION
3 楼
GAO199675 [专家分:0] 发布于 2006-08-25 20:59:00
Private Sub Command1_click()
Dim a(100000), aa(100000), b(100000), bb(100000), c(100000)
n = InputBox("请输入数字")
n = Val(n)
c(2) = "2": c(3) = "3": c(5) = "5": c(7) = "7": c(13) = "13"
bb(1) = "2": bb(2) = "3": bb(3) = "5": bb(4) = "7": bb(5) = "13"
b(1) = 2: b(2) = 3: b(3) = 5: b(4) = 7: b(5) = 13
k = 5: f = 0
Cls
If c(n) <> "" Then Print n; "="; n: Print
For i = 1 To 3 '1---
For j = 1 To k: a(j) = b(j): aa(j) = bb(j): Next j
For j = 1 To k
x = 2: Call uu(a, j, x, c, f, b, bb, aa, n)
x = 3: Call uu(a, j, x, c, f, b, bb, aa, n)
x = 5: Call uu(a, j, x, c, f, b, bb, aa, n)
x = 7: Call uu(a, j, x, c, f, b, bb, aa, n)
x = 13: Call uu(a, j, x, c, f, b, bb, aa, n)
Next j
k = f: f = 0
Next i
For i = 1 To 200 '2----
Print Tab(o * 25); i; "="; c(i);
o = o + 1
If i = Int(i / 5) * 5 Then Print: o = 0
Next i
End Sub
Sub uu(a, j, x, c, f, b, bb, aa, n)
d = a(j) + x
If c(d) = "" Then
f = f + 1
b(f) = d
bb(f) = aa(j) + "+" + Str(x)
c(d) = bb(f)
If d = n Then Print n; "="; c(n): Print
End If
d = a(j) * x
If c(d) = "" Then
f = f + 1
b(f) = d
bb(f) = aa(j) + "*" + Str(x)
c(d) = bb(f)
If d = n Then Print n; "="; c(n): Print
End If
d = a(j) - x
If d > 0 Then
If c(d) = "" Then
f = f + 1
b(f) = d
bb(f) = aa(j) + "-" + Str(x)
c(d) = bb(f)
If d = n Then Print n; "="; c(n): Print
End If
End If
End Sub
我来回复