ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 14384|回复: 21

[Excel 程序开发] [开_102]一道趣味算术题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-7-4 17:14 | 显示全部楼层 |阅读模式

一道有趣的算术题(见于北京市某年小学奥数竞赛)

先看几个数:312132,231213,41312432,23421314

可以看到以上字串有以下特点: 2个1 之间有1个数,2个2 之间有2个数,2个3之间有3个数...
试找出由(1,1,2,2,3,3,4,4,5,5,6,6,..N,N) 2*N(N<=8) 个数组成的字符串满足上述条件的所有组合,即2个1 之间有1个数,2个2 之间有2个数,2个3之间有3个数...2个N之间有N个数,通过点击上面的“全部列出”按钮将其列到前2*N列中

可以证明 N 只能是 4K,4K+3 的形式.

N=1,2,5,6,9时无解
N=3:   312132,231213
N=4:   41312432,23421314
N=7;   52个解
N=8:   300个解

截至日期 2006-8-1,只要代码不雷同,结果正确,计算快速,算法巧妙均有加分机会。


单选投票, 共有 23 人参与投票

距结束还有: 3252 天2 小时42 分钟

您所在的用户组没有投票权限

TA的精华主题

TA的得分主题

发表于 2006-7-5 09:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-7-5 12:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

俺对数学题也晕.
穷举,心里踏实一些.不再去想优化了,格式上和版主的要求有点差异.权做抛砖了.

VSEFUarA.rar (16.75 KB, 下载次数: 118)

TA的精华主题

TA的得分主题

发表于 2006-7-6 18:07 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-7-6 23:24 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-7-7 15:16 | 显示全部楼层

这样行吗

djqNCCjs.rar (72.61 KB, 下载次数: 159)


TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-10 00:48 | 显示全部楼层
QUOTE:
以下是引用lotustower在2006-7-6 23:24:45的发言:
How about 0,0 ......9,9 ?

无解.

假设1,2,3,4,...n 其中较小的一个位于 a1,a2,a3,a.....,an,则较大的一个分别位于a1+2,a2=3,a3+4,...an+n+1

而且:

a1,a2,a3,a.....,an,   a1+2,a2=3,a3+4,...an+n+1 为1,1,2,2,3,3,...n,n 的一个全排列

则(a1+a2+...+an  )+ (a1+2 +a2+3+a3+4+...an+n+1)=2*(1+2+3+...+n)=n*(n+1)

所以2(a1+a2+...+an)+ (2+3+...+n+1)=n*(n+1)

a1+a2+...+an=n(n+1)/4

所以,n一定是4k 或 4k+3 的形式.

另:

111222333444555666777888999 倒可以满足,呵呵:

3 4 7 9 3 6 4 8 3 5 7 4 6 9 2 5 8 2 7 6 2 5 1 9 1 8 1

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-10 00:59 | 显示全部楼层
n=3    2
n=4    2
n=7    52
n=8    300
n=11   35584
n=12   216288
n=15   79619280
n=16   653443600
n=19   513,629,782,560
n=20   5,272,675,722,400
n=23   7,598,911,885,030,960
以上是n取相应值时满足条件的排列的个数

TA的精华主题

TA的得分主题

发表于 2006-7-10 01:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

Almost-Langford numbers , written by pgc01.

Option Explicit
Option Base 1
Const lCol As Long = 1 ' Writes in Column A

Sub AlmostLangford()
Dim iDigits(), iNDigits As Integer, lRow As Long
   
    For iNDigits = 2 To 18 Step 2
        ReDim iDigits(iNDigits)
        Call AlmostLangfordN(iDigits, lRow)
    Next

End Sub

Sub AlmostLangfordN(ByRef iDigits(), ByRef lRow As Long)
Dim iPosFree As Integer, iDigitsTmp(), iDigit As Integer
Dim iNDigits As Integer, i As Integer

    iNDigits = UBound(iDigits)
    Do While True
        'Checks if last free position was filled
        If iPosFree <> 0 Then If IsEmpty(iDigits(iPosFree)) Then Exit Sub
        'Determines next free position
        For iPosFree = iPosFree + 1 To iNDigits
            If IsEmpty(iDigits(iPosFree)) Then Exit For
        Next
        If iPosFree = iNDigits + 1 Then Exit Sub

        ' Tries all digits
        For iDigit = 0 To 9
            If iPosFree + iDigit + 1 > iNDigits Then Exit For
            ' Checks if digit already used
            For i = 1 To iNDigits
                If iDigits(i) = iDigit And Not IsEmpty(iDigits(i)) Then Exit For
            Next
            ' Cannot start with zero
            If i > iNDigits And Not (iPosFree = 1 And iDigit = 0) Then
                If IsEmpty(iDigits(iPosFree + iDigit + 1)) Then
                    ' Initialises idigitstmp
                    ReDim iDigitsTmp(iNDigits)
                    For i = 1 To iNDigits
                        iDigitsTmp(i) = iDigits(i)
                    Next
                    iDigitsTmp(iPosFree) = iDigit
                    iDigitsTmp(iPosFree + iDigit + 1) = iDigit
                   
                    ' Checks if array is full (Almost-Langford number)
                    For i = 1 To iNDigits
                        If IsEmpty(iDigitsTmp(i)) Then Exit For
                    Next
                    If i > iNDigits Then
                        lRow = lRow + 1
                        Cells(lRow, lCol) = "'" & Join(iDigitsTmp, "")
                    Else
                        Call AlmostLangfordN(iDigitsTmp, lRow) 'iDigit + 1
                    End If
                End If
            End If
        Next iDigit
    Loop

End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-10 01:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用lg_cai在2006-7-7 15:16:00的发言:

这样行吗


兄台的功力实在令人敬佩.有兴趣把3个N的也做一做. n mod 9={0,1,8} 时有解.

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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-23 14:32 , Processed in 0.044627 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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