vba程序用7重循环来计算24

简介: vba程序用7重循环来计算24
'添加三件控件,F1单元格存放最大值
Sub Cal()
Dim t As Single
Dim Num(1 To 4)
t = Timer
For i = 1 To 4
    If Sheets(1).CheckBox1.Value Then Cells(1, i) = WorksheetFunction.RandBetween(1, Range("F1"))
    Num(i) = Cells(1, i)
Next
r = Cells(Rows.Count, 1).End(xlUp).Row + 1
Range("A2:B" & r) = ""
Application.ScreenUpdating = False
r = 3
For a = 1 To 4
    For b = 1 To 4
        For c = 1 To 4
            For d = 1 To 4
                For i = 1 To 4
                    For j = 1 To 4
                        For k = 1 To 4
                            If a <> b And a <> c And a <> d And b <> c And b <> d And c <> d Then
                                '无括号的运算
                                Cells(r, 1) = Num(a) & Sign(i) & Num(b) & Sign(j) & Num(c) & Sign(k) & Num(d) & " = "
                                Cells(r, 2) = "=" & Num(a) & Sign(i) & Num(b) & Sign(j) & Num(c) & Sign(k) & Num(d)
                                If Cells(r, 2) = 24 Then r = r + 1
                                '有括号运算(a b)c d
                                Cells(r, 1) = "(" & Num(a) & Sign(i) & Num(b) & ")" & Sign(j) & Num(c) & Sign(k) & Num(d) & " = "
                                Cells(r, 2) = "=" & "(" & Num(a) & Sign(i) & Num(b) & ")" & Sign(j) & Num(c) & Sign(k) & Num(d)
                                If Not IsError(Cells(r, 2)) Then '注意有括号要避免分母为0的情况
                                    If Cells(r, 2) = 24 Then r = r + 1
                                End If
                                '(a b c) d
                                Cells(r, 1) = "(" & Num(a) & Sign(i) & Num(b) & Sign(j) & Num(c) & ")" & Sign(k) & Num(d) & " = "
                                Cells(r, 2) = "=" & "(" & Num(a) & Sign(i) & Num(b) & Sign(j) & Num(c) & ")" & Sign(k) & Num(d)
                                If Not IsError(Cells(r, 2)) Then
                                    If Cells(r, 2) = 24 Then r = r + 1
                                End If
                                'a ( b c) d
                                Cells(r, 1) = Num(a) & Sign(i) & "(" & Num(b) & Sign(j) & Num(c) & ")" & Sign(k) & Num(d) & " = "
                                Cells(r, 2) = "=" & Num(a) & Sign(i) & "(" & Num(b) & Sign(j) & Num(c) & ")" & Sign(k) & Num(d)
                                If Not IsError(Cells(r, 2)) Then
                                    If Cells(r, 2) = 24 Then r = r + 1
                                End If
                                'a (b c d)
                                Cells(r, 1) = Num(a) & Sign(i) & "(" & Num(b) & Sign(j) & Num(c) & Sign(k) & Num(d) & ")" & " = "
                                Cells(r, 2) = "=" & Num(a) & Sign(i) & "(" & Num(b) & Sign(j) & Num(c) & Sign(k) & Num(d) & ")"
                                If Not IsError(Cells(r, 2)) Then
                                    If Cells(r, 2) = 24 Then r = r + 1
                                End If
                                'a b (c d)
                                Cells(r, 1) = Num(a) & Sign(i) & Num(b) & Sign(j) & "(" & Num(c) & Sign(k) & Num(d) & ")" & " = "
                                Cells(r, 2) = "=" & Num(a) & Sign(i) & Num(b) & Sign(j) & "(" & Num(c) & Sign(k) & Num(d) & ")"
                                If Not IsError(Cells(r, 2)) Then
                                    If Cells(r, 2) = 24 Then r = r + 1
                                End If
                                '(a b) (c d)
                                Cells(r, 1) = "(" & Num(a) & Sign(i) & Num(b) & ")" & Sign(j) & "(" & Num(c) & Sign(k) & Num(d) & ")" & " = "
                                Cells(r, 2) = "=" & "(" & Num(a) & Sign(i) & Num(b) & ")" & Sign(j) & "(" & Num(c) & Sign(k) & Num(d) & ")"
                                If Not IsError(Cells(r, 2)) Then
                                    If Cells(r, 2) = 24 Then r = r + 1
                                End If
                            End If
                        Next
                    Next
                Next
            Next
        Next
    Next
Next
If Cells(r, 2) <> 24 Then Range("A" & r & ":B" & r) = ""
r = Cells(Rows.Count, 1).End(xlUp).Row
If r = 1 Then
    Cells(2, 1) = "此四数无解!"
    Exit Sub
Else
    Cells(2, 1) = "共" & r - 2 & "种解法"
End If
'以下去掉重复解法,如不计重新以下代码除最后2行可以全部删除
'只要公式的字串不同即算一种解法,而不考虑交换律、结合律、运算符等级的实质相同。
For j = r To 4 Step -1
    For i = 3 To j - 1
        If Cells(j, 1) = Cells(i, 1) Then
            Cells(j, 1) = ""
            Cells(j, 2) = ""
        End If
    Next
Next
'以下删除空行后重新计算行数
For i = r To 3 Step -1
    If Cells(i, 1) = "" Then
        Rows(i).Delete
    End If
Next
r = Cells(Rows.Count, 1).End(xlUp).Row
Cells(2, 1) = "共" & r - 2 & "种解法"
'计算时间
Cells(2, 1) = Cells(2, 1) & ",耗时" & Timer - t & "秒。"
Application.ScreenUpdating = True
End Sub
Function Sign(x)
Select Case x
    Case 1: Sign = " + "
    Case 2: Sign = " - "
    Case 3: Sign = " * "
    Case 4: Sign = " / "
End Select
End Function

20201212103037800.jpg


目录
相关文章
|
9月前
|
机器学习/深度学习 运维 数据可视化
Python时间序列分析:使用TSFresh进行自动化特征提取
TSFresh 是一个专门用于时间序列数据特征自动提取的框架,支持分类、回归和异常检测等机器学习任务。它通过自动化特征工程流程,处理数百个统计特征(如均值、方差、自相关性等),并通过假设检验筛选显著特征,提升分析效率。TSFresh 支持单变量和多变量时间序列数据,能够与 scikit-learn 等库无缝集成,适用于大规模时间序列数据的特征提取与模型训练。其工作流程包括数据格式转换、特征提取和选择,并提供可视化工具帮助理解特征分布及与目标变量的关系。
594 16
Python时间序列分析:使用TSFresh进行自动化特征提取
在Linux中,有一堆日志文件,如何删除7天前的日志文件?
在Linux中,有一堆日志文件,如何删除7天前的日志文件?
|
存储 Unix Linux
Linux 内核源代码情景分析(二)(上)
Linux 内核源代码情景分析(二)
106 2
|
JavaScript 前端开发
nodejs使用axios以formdata形式上传图片
nodejs使用axios以formdata形式上传图片
|
缓存 负载均衡 数据库
构建高性能微服务架构:策略与实践
【5月更文挑战第21天】 随着现代业务需求的不断演进,传统的单体应用架构已难以满足快速迭代和灵活部署的要求。微服务架构应运而生,以其服务的细粒度、独立性和弹性优势成为企业转型的重要选择。本文将深入探讨如何构建一个高性能的微服务系统,从服务划分原则到性能优化技巧,旨在为开发者提供一套系统的微服务性能提升方案。文章将重点讨论在设计高并发、低延迟的微服务时需要考虑的关键因素,包括服务治理、缓存策略、负载均衡以及异步通信机制等。
|
JavaScript Java 测试技术
基于ssm+vue.js的视频点播系统附带文章和源代码设计说明文档ppt
基于ssm+vue.js的视频点播系统附带文章和源代码设计说明文档ppt
149 0
|
Python
ModuleNotFoundError: No module named ‘IPython‘
ModuleNotFoundError: No module named ‘IPython‘
404 0
|
存储 缓存 NoSQL
Redis专题(持续更新) 04-VIP-Redis缓存设计与性能优化
对于恶意攻击,向服务器请求大量不存在的数据造成的缓存穿透,还可以用布隆过滤器先做一次过滤,对于不存在的数据布隆过滤器一般都能够过滤掉,不让请求再往后端发送。缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。向布隆过滤器询问 key 是否存在时,跟 add 一样,也会把 hash 的几个位置都算出来,看看位数组中这几个位。发过来,缓存层支撑不住,或者由于缓存设计不好,类似大量请求访问bigkey,导致缓存能支撑的并发急剧下。
347 3
|
Unix Linux 程序员
|
算法 Java 程序员
【算法训练-二叉树 一】【遍历二叉树】前序遍历、中序遍历、后续遍历、层序遍历、锯齿形层序遍历、二叉树右视图
【算法训练-二叉树 一】【遍历二叉树】前序遍历、中序遍历、后续遍历、层序遍历、锯齿形层序遍历、二叉树右视图
175 0