导航
  • 全部
  • Ada助手

一道有趣的数学题

runrelax 2004-03-28 08:45:53
题目:一个两位数减一个两位数的差,然后除以一个一位数,得出的结果是一个两位数
但是所使用的数字中不能重复和第一个数字减第二个数的结果也不能和其它的数字重复.

代码如下:

Private Function NumberBool(NumberOne As String, NumberStr1 As String, NumberStr2 As String) As Boolean
Dim pos As Integer
pos = InStr(NumberOne, NumberStr1)
If pos = 0 Then
pos = InStr(NumberOne, NumberStr2)
If pos = 0 Then
NumberBool = True
End If
Else
NumberBool = False
End If
End Function
Private Function NumberBool1(NumberOne As String, NumberStr As String) As Boolean
Dim pos As Integer
pos = InStr(NumberOne, NumberStr)
If pos = 0 Then
NumberBool1 = True
Else
NumberBool1 = False
End If
End Function
Private Sub Command1_Click()
Text1.Text = ""

Dim one As Integer '被除数 (one-tow)/num=ret(表达式)
Dim two As Integer '除数
Dim num As Integer '个位数
Dim ret As Single '结果
Dim one_two As Integer '减后的数
Dim cou As Integer '有多少种结果
cou = 0

Dim pos As Integer
Dim one1 As String '被除数的第一个字符
Dim one2 As String '被除数的每二个字符
Dim two1 As String '除数的第一个字符
Dim two2 As String '除数的第二个字符

Dim ret1 As String '结果的第一个字符
Dim ret2 As String '结果的第二个字符
Dim one_two1 As String '减后的第一个字符
Dim one_two2 As String '减后的第二个字符

For one = 10 To 99
For two = 10 To one - 1
DoEvents
Label1.Caption = CStr(one) '用于看的(没什么意义的)

two1 = Left(CStr(two), 1) '除数第一个字符
two2 = Right(CStr(two), 1) '除数第二个字符
one1 = Left(CStr(one), 1) '被除数的第一个字符
one2 = Right(CStr(one), 1) '被除数的每二个字符

If two1 <> two2 And one1 <> one2 Then '1 '除数和被除数中的各字符不相同
If NumberBool(CStr(one), two1, two2) = True Then '2 '被除数中不存在除数中的字符
If NumberBool(CStr(two), one1, one2) = True Then '3 '除数中不存在被除数中的字符
one_two = one - two
one_two1 = Left(CStr(one - two), 1)
one_two2 = Right(CStr(one - two), 1)
If one_two1 <> one_two2 And NumberBool(CStr(one), one_two1, one_two2) = True And NumberBool(CStr(two), one_two1, one_two2) = True Then '4 所减后的字符不相同
For num = 2 To 9
DoEvents
If CStr(num) <> one_two1 And CStr(num) <> one_two2 And NumberBool1(CStr(one), CStr(num)) = True And NumberBool1(CStr(two), CStr(num)) = True Then '5 所要除的数不和前面的相同
ret = one_two / num

If ret = Int(one_two / num) Then '6 如果除出的是整数
ret1 = Left(CStr(ret), 1)
ret2 = Right(CStr(ret), 1)
If ret1 <> ret2 And NumberBool(CStr(one), ret1, ret2) = True And NumberBool(CStr(two), ret1, ret2) = True And NumberBool(CStr(one_two), ret1, ret2) = True And NumberBool1(CStr(ret), CStr(num)) = True Then '7 最后结果的字符和上面的不同
If ret >= 10 Then '8 得出的结果是两位数
Text1.Text = Text1.Text & CStr(one) & "-" & CStr(two) & "=" & CStr(one_two) & vbTab
Text1.Text = Text1.Text & CStr(one_two) & "/" & CStr(num) & "=" & CStr(ret) & vbCrLf
cou = cou + 1
End If '8
End If '7
End If '6
End If '5
Next num
End If '4
End If '3
End If '2
End If '1

Next two
Next one
Label1.Caption = "完成"
MsgBox "有" & CStr(cou) & "种结果", vbOKOnly + vbInformation, "所有的可能"
End Sub

以上用到了一个text、label、command控件
详情请到我的主页里下载
主页:http://runrelax.533.net E-mail:run.relax@163.com QQ:57952855
...全文
给本帖投票
115 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
notheal 2004-04-03
  • 打赏
  • 举报
回复
继续努力!
northwolves 2004-04-03
  • 打赏
  • 举报
回复
同为数学爱好者,给你一个稍简单的代码:

' suppose the five num is a,b,c,d,e. As a-b=c , c/d=e,e>=10 and d>=2,we can know that c>=20. As b>=10,we know that a>=30
Private Sub Command1_Click()
Dim a As Integer, b As Integer, c As Integer, e As Integer
For a = 30 To 99
For b = 10 To a - 20 ' because a-b>=20
c = a - b
For e = 10 To 45 ' because d*e<100 and d>=2
If c Mod e = 0 Then
If isrepeat(a, b, c, c / e, e) = False Then
Debug.Print a & "-" & b & "=" & c & vbTab & c & "/" & c / e & "=" & e
End If
End If
Next
Next
Next
End Sub

Function isrepeat(ParamArray a()) As Boolean
Dim temp As String, i As Integer, num As String
isrepeat = FASLE
temp = Join(a, "")
For i = 1 To Len(temp)
num = Mid(temp, i, 1)
If UBound(Split(temp, num)) > 1 Then isrepeat = True: Exit Function
Next
End Function
juror 2004-04-01
  • 打赏
  • 举报
回复
排列组合你用的方法不是很好。
runrelax 2004-04-01
  • 打赏
  • 举报
回复
我也是觉得,如果再使用一个函数,用于回调,那代码就不会那么长了,而且也更加的容易看,哈哈哈!!!没事就做做题,原来感觉蛮不错了,哈哈!!
limitworld 2004-04-01
  • 打赏
  • 举报
回复
homeland520 2004-03-30
  • 打赏
  • 举报
回复
up
northwolves 2004-03-29
  • 打赏
  • 举报
回复
搂主精神可嘉,继续努力!
runrelax 2004-03-29
  • 打赏
  • 举报
回复
不好意思,我上面的注释有点小问题,改为如下
one '第一个两位数
two '第二个两位数
one_two 'one-two后的两位数
ret '结果
这个题目也就是要求所使用的数字不能相同,0到9这十个数字只能使用一次,而且结果要和前面所说的。
ColdMooon 2004-03-28
  • 打赏
  • 举报
回复
Thinking.........

1,065

社区成员

发帖
与我相关
我的任务
社区描述
VB 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧