Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1557|回复: 5

and语句满足两个条件不成功

[复制链接]
发表于 2019-12-3 00:15 | 显示全部楼层 |阅读模式
各位老师好:我这里x准备输入为24 y准备输入为36. 但运行结果为18,并没有满足第二个if 里面的 a mod n <> 0啊。
还请老师们指教一下。


Sub max()
Dim a As Integer, b As Integer, n As Long, x As String, y As String
    x = InputBox("第一个数为:")                         '  准备输入值为:24
    a = Val(x)
    y = InputBox("第二个数为:")                         '  准备输入值为:36
    b = Val(y)

        If a > b Then
           n = b - 1
        Else
         n = a - 1                                                     '  取两个数中较小的数并减1,准备下步做为除数。
        End If

        Do
        If a Mod n <> 0 And b Mod n <> 0 Then        '  除数必须能被两个数整除。
           n = n - 1                                                   '  如果不满足则继续减1。
        Else
           MsgBox a & ("和") & b & ("的最大公约数为:") & n
           Exit Do
        End If
        Loop


End Sub


 楼主| 发表于 2019-12-3 00:17 | 显示全部楼层
我这里的意图是想求x和y两个数的最大公约数。。方法是用两个数较小的那一个数一直减1直到能同时整除x和y。谢谢
回复

使用道具 举报

发表于 2019-12-3 07:49 来自手机 | 显示全部楼层
把 AND 改为 OR,逻辑有误,你在纸上测试一下。另,一般用辗转相除法(欧几里德算法)求最大公约数,详见百度。
回复

使用道具 举报

发表于 2019-12-3 09:34 | 显示全部楼层
Sub test()
    MsgBox gcd4(24, 36)
End Sub


'方法1:递归
Function gcd(a, b)
    If b = 0 Then
        gcd = a
    Else
        gcd = gcd2(b, a Mod b)
    End If
End Function


'方法2:辗转相除法
Function gcd2(a, b)
    Dim r
    Do
        r = a Mod b
        a = b           '本次的除数,下次是被除数
        b = r           '本次的余数,下次是除数
    Loop Until r = 0
    gcd2 = a            '返回余数为0时的除数
End Function


'方法3:更相减损法
'http://baike.baidu.com/item/最大公约数
Function gcd3(a, b)
    Dim i, temp
    Do Until a = b

        '1)任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步
        If (a Mod 2 = 0) And (b Mod 2 = 0) Then
            a = a / 2
            b = b / 2
            i = i + 1   '约简的次数
        Else
            If a < b Then temp = a: a = b: b = temp    '确保a>b
            '2)以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
            a = a - b   '用两数之差,替代较大的数
        End If
    Loop
    gcd3 = IIf(i = 0, a, b * i * 2)
End Function


'方法4:直接尝试
Function gcd4(a, b)
    Dim c, i
    c = IIf(a < b, a, b)
    For i = c To 2 Step -1
        If a Mod i = 0 And b Mod i = 0 Then Exit For
    Next i
    gcd4 = i
End Function




方法4是照楼主的主思路写的

评分

参与人数 1学分 +2 收起 理由
0126 + 2 学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2019-12-3 21:52 | 显示全部楼层
rardge2015 发表于 2019-12-3 07:49
把 AND 改为 OR,逻辑有误,你在纸上测试一下。另,一般用辗转相除法(欧几里德算法)求最大公约数,详见百 ...

谢谢指导,那个欧几里德方法确实方便。。只是我想用计算机用笨办法试一试。。做验算用。。再次感谢。
回复

使用道具 举报

 楼主| 发表于 2019-12-3 21:54 | 显示全部楼层
爱疯 发表于 2019-12-3 09:34
Sub test()
    MsgBox gcd4(24, 36)
End Sub

哇。。大神。。膜拜。。。我只是个小白。。。还没学到function。。看来这个函数好牛逼啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 05:31 , Processed in 0.286870 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表