数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 7512|回复: 7

将各位数字都不大于 3 的正整数按照从小到大的次序排成一个数列 {a(n)} ,求 a(2016)

[复制链接]
发表于 2018-3-26 22:52 | 显示全部楼层 |阅读模式
这是台湾网友 YAG 发表在“陆老师的《数学中国》园地”的一个帖子,

欢迎大家一起来想想如何解答:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2018-3-27 09:46 | 显示全部楼层
本帖最后由 天山草@ 于 2018-3-27 09:52 编辑

这个怎么算呀? 不会不会。
如果写个小程序,那很好算,我算的结果是: 数列的第 2016 项是 133200。

编程思路:从最小的数 1 开始依次加 1,若不符合要求则淘汰,符合要求的依次登记在册。
登记够了 2016 个数字就停止计算。
发表于 2018-3-27 09:48 | 显示全部楼层
1 =>1
2 =>2
3 =>3
4 =>10
5 =>11
6 =>12
7 =>13
8 =>20
9 =>21
10 =>22
11 =>23
12 =>30
13 =>31
14 =>32
15 =>33
16 =>100
17 =>101
18 =>102
19 =>103
20 =>110
21 =>111
22 =>112
23 =>113
24 =>120
25 =>121
26 =>122
27 =>123
28 =>130
29 =>131
30 =>132
31 =>133
32 =>200
33 =>201
34 =>202
35 =>203
………………
2010 =>133122
2011 =>133123
2012 =>133130
2013 =>133131
2014 =>133132
2015 =>133133
2016 =>133200
发表于 2018-3-27 10:05 | 显示全部楼层

厉害,4进制表示,妙!
发表于 2018-3-27 10:07 | 显示全部楼层
天山草@ 发表于 2018-3-27 09:46
这个怎么算呀? 不会不会。
如果写个小程序,那很好算,我算的结果是: 数列的第 2016 项是 133200。

2016÷4=504......0
504÷4=126......0
126÷4=31......2
31÷4=7......3
7÷4=1......3
将最后1个商与全部余数连起来,得133200。
也就是:10进制的2016化成4进制的133200。
 楼主| 发表于 2018-3-27 10:10 | 显示全部楼层
本帖最后由 luyuanhong 于 2018-3-27 10:13 编辑

谢谢楼上 天山草 的解答。下面是此题的详细解答过程:

  将各位数字都不大于 3 的正整数按照从小到大的次序排成一个数列 {a(n)} ,求 a(2016) 。

  这问题实际上是将一个十进位数 2016 化为一个四进位数的问题。

    具体的做法是:将 2016 逐步整除 4 ,并将每次整除时的余数记录下来。最后,将各次整除

得到的余数,按照从右到左的次序排列起来,就得到了与 2016 对应的四进位数。

                       2016÷4=504……0 ,

                       504÷4=126……0 ,

                       126÷4=31……2 ,

                       31÷4=7……3 ,

                       7÷4=1……3 ,

                       1÷4=0……1 。

   可见,a(2016)=133200 。
发表于 2018-3-27 10:28 | 显示全部楼层
下面是用 VB 写的小程序 ——
Private Sub form_Click()
     Open "各位数字均不大于 3 的数列.txt" For Output As #1   ' 定义文件名
     Dim x, a As String   ' 指定 x, a 两变量都是字符串
         
     x = 0
     n = 0
     For i = 1 To 10000000 ' 实际到不了一千万这么多循环,改成更大的数字也无妨。
         x = x + 1   '从最小的数 1 开始依次加 1,再把不符合要求的去掉,符合的保留。
         a = Val(x)  ' 把字符串变成数字
         
         '以下筛选出符合要求的字串:
        L = Len(Trim(a))   '求出字符串的长度
        For j = 1 To L     '针对不同的长度分别计算
          If Mid(a, j, 1) > 3 Then GoTo 888   ' 筛选出不合要求者
        Next j
        
      If n = 2016 Then GoTo 999   '项数达到第 2016 项,停止运行。
               
      n = n + 1    ' 项数累计
      Print n; "=>"; Trim(a)   ' 统计出符合要求的,并给出其在数列中的编号。
      Print #1, n; "=>"; Trim(a)  '写入文件
888:  Next i
999:  Close
      End Sub
   
发表于 2018-3-28 06:17 | 显示全部楼层
噢,考虑将 2016 化为四进制的思路好。
用 mathematica 软件,只须一条指令就能算出结果 ——

IntegerDigits[2016, 4]     (* 2016 化为四进制 *)
运算结果是:
{1,3,3,2,0,0}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2026-5-15 21:04 , Processed in 0.122115 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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