ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享]最接近π值的5位分数的一种递归算法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-8-22 15:35 | 显示全部楼层
本帖已被收录到知识树中,索引项:递归
真是学习的好帖,许多不明白的东西都懂了

TA的精华主题

TA的得分主题

发表于 2014-7-16 11:16 | 显示全部楼层
winland 发表于 2007-8-31 13:19
superPI里面有介绍pi值的算法, 下面用三次循环可以获得3.14159268979的PI. 用这个算法可以再精确的,有兴趣的 ...

这个复制下来看看。

TA的精华主题

TA的得分主题

发表于 2014-7-16 14:07 | 显示全部楼层
可以计算任意比例数值的递归代码:

题目规则:0-9这10个数字,拆分为2组各5个不重复,组成的两个数进行除法运算,
求结果最接近目标值的那几组数。
  1. Dim x#, k&, cnt&
  2. Sub test()
  3.     x = 3.1415926535
  4.     x = Range("f1") '可在F1单元格中任意设置小数
  5.     k = 1: cnt = 0: [a1].CurrentRegion = ""
  6.     Dim a(9)
  7.     For i = 1 To 9
  8.         If i * x > 10 Then Exit For
  9.         a(i) = 1: Call dg(a, i, 2): a(i) = 0
  10.     Next
  11.     k = k - 1: [g1] = k: [g2] = cnt
  12.     If k Then [a1].Resize(k, 4).Sort [d1], 1, , , , , , 2
  13. End Sub
  14. Sub dg(a, fm, t)
  15.     Dim i&, j&, s&
  16.     cnt = cnt + 1
  17.    
  18.     For i = 0 To 9
  19.         If a(i) = 0 Then
  20.             If t = 5 Then
  21.                 s1 = fm * 10 + i
  22.                 p = Round(s1 * x / 10, 0)
  23. '                p = Round(s1 * 0.31415926535, 0)
  24.                 If p < 10000 Then
  25.                     b = a: b(i) = 1: s = p
  26.                     For j = 1 To 4
  27.                         n = s Mod 10: If b(n) Then Exit For
  28.                         b(n) = 1: s = s \ 10
  29.                     Next
  30.                     If j = 5 Then
  31.                         For j = 0 To 9
  32.                             If b(j) = 0 Then p = p * 10 + j: Exit For
  33.                         Next
  34.                         Cells(k, 1) = p
  35.                         Cells(k, 2) = s1
  36.                         Cells(k, 3) = p / s1
  37.                         Cells(k, 4) = Abs(p / s1 - x)
  38. '                        Cells(k, 4) = Abs(p / s1 - 3.1415926535) 'Pi=3.14159265358979
  39.                         k = k + 1
  40.                     End If
  41.                 End If
  42.             Else
  43.                 a(i) = 1: Call dg(a, fm * 10 + i, t + 1): a(i) = 0
  44.             End If
  45.         End If
  46.     Next
  47. End Sub
复制代码
发现,如果是求Pi的倒数=1/Pi()=0.318309886183791的近似值,
则前面5组是:
19273        60548
31062        97584
18432        57906
15720        49386
30712        96485

而和Pi()的前五组相差较大:
85910        27346
97584        31062
84531        26907
96485        30712
86190        27435


仅第2组在两边都出现。

TA的精华主题

TA的得分主题

发表于 2015-11-3 15:06 | 显示全部楼层
香川群子 发表于 2014-7-16 14:07
可以计算任意比例数值的递归代码:

题目规则:0-9这10个数字,拆分为2组各5个不重复,组成的两个数进行 ...

这么老的贴子都给你翻出来了,牛

TA的精华主题

TA的得分主题

发表于 2017-5-21 20:37 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 06:17 , Processed in 0.038885 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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