一个数除以另一个数,得到一个商. 这个商可能是个循环小数除不尽. a/b=c问怎么确定这个循环小数c的循环节长度?

worldbankc 2009-11-02 11:25:25


例如? a/b=c, 假设 a=125456, b=23654845742315 , 求c, 已知c肯定是个循环小数? 但不知道c的循环节长度, 怎么根据 a,b的关系知道c的循环节大小呢? 有没有什么简单办法来计算知道循环节大小? 我编程寻找循环节长度,往往循环节都长达一万亿位以上,绝大部分程序都难以寻找.
...全文
1798 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
bawgiitx 2009-11-03
  • 打赏
  • 举报
回复
记录余值,两相等余值间即是
perfecttt 2009-11-03
  • 打赏
  • 举报
回复
mark,
算法中的匹配?
二次匹配?
perfecttt 2009-11-03
  • 打赏
  • 举报
回复
mark,
算法中的匹配?
二次匹配?
liumianjia 2009-11-03
  • 打赏
  • 举报
回复
1,a和b互约,得到最小的a和b(把这个b定义为n,下面要用到)
2,a=a%b,(此时得到a<n),记录a
3,a=10*a%b,判断新a是否在记录中能找到,是则结果为(记录总数-重现的记录所在位置),否再次记录a,重复步骤3

这个方法的空间复杂度为步骤1中所得到的n,(因为a<n)

时间复杂度是n*log(2,n),其中步骤3最多循环次数为n,(因为a<n),而内部的记录查找需要log(2,n)
gumbour 2009-11-03
  • 打赏
  • 举报
回复
楼主真是搞笑,5楼的答案不知道你能否看得懂。

不过相信你看懂了也没用,就你这编程水平,03年就能搞出所谓的万亿位循环节,你当你的内存单位是T啊(1万亿 = 1T = 10^12),可笑的是到09年还没发现你的错误所在。

5楼的方法基本原理确实已经是最好的办法了,不过也称不上什么顶尖数学问题,很多数论书里有。但一样要用到基本的寻相同余数,仅在除数不是质数时有提升。
liuhao159753 2009-11-03
  • 打赏
  • 举报
回复
lz,你注定就是一菜鸟,因为你不够谦逊.....
fire_woods 2009-11-03
  • 打赏
  • 举报
回复
小学的时候,我会.
Silitex 2009-11-03
  • 打赏
  • 举报
回复
一定要别人骂你你才爽是吧!虽然上面只有一个人的答案是你想要的,其他人的答案其实你早就知道了!
Silitex 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 worldbankc 的回复:]
我问的是数学原理.  不是编程,程序倒很简单早在2003程序就写好了.    我问的是在数学上怎么知道 a/b 时,循环节的计算公式.  有没有数学计算公式.  用程序要寻找循环节是很愚蠢的办法. 顶多用来证明一些计算公式是否正确.

  我再强调一遍我问的是,有没有数学计算a/b循环节的公式或计算方法.  这个可是极其困难的哦?  我至今没有解决. 这个要有顶尖数学才能的人才能解.  不是一些凡夫俗子所能解决的.
[/Quote]
楼主是一个垃圾!
  • 打赏
  • 举报
回复
迅雷笔试题,我当时就陷入误区。
其实很简单,你只要模拟除法就可以了。

比如3/7
结果为0,余数为3
然后30/7,结果为4,余数为2,
然后20/7.。。
知道出现有重复的余数,(所以最好用map统计一下余数)即为循环小数。然后只要继续计算,直到下次出现相同的余数,存起来的结果就是循环的数,长度也容易得出。


大体思路就是这样。
worldbankc 2009-11-03
  • 打赏
  • 举报
回复

原来这里有英文的说明:
http://mathworld.wolfram.com/MultiplicativeOrder.html
FBugFramework 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 smile_tiger 的回复:]
晕,兴冲冲地写完后,发现就是5楼写的东西的一小部分
[/Quote]

.
FBugFramework 2009-11-03
  • 打赏
  • 举报
回复
晕,5F说的更加明确,没看回复。
adfas 2009-11-03
  • 打赏
  • 举报
回复
其实我最想说的是,楼主,你真是是傻逼
FBugFramework 2009-11-03
  • 打赏
  • 举报
回复
我将做大胆的猜想(需证明):

1,两个整数相除,结果一定是循环小数。 (只是有些循环节更大些)
2,循环节大小跟被除数无关。
3,循环节大小跟除数成决定性关系。
4,如果被除数为1,那循环小数为“纯循环数”;如果如果被除数>1,那循环小数可能为“非纯循环数”。
5,除数的最大素数越大,往往循环节越大。



关于@3的关系:(我很多概念忘记了,叫不上名,用实际数字说明)
Ex: 153 = 17 * 3 * 3;
我们现说“153”由两个素数组成: 17,3。

那么 循环节大小 受17主要影响,受3次要影响。





被除数:1; 除数:如下:
------------------------------------------------------
2, 除尽
3, 0.33333333333333333333333333333333
5, 除尽
7, 0.14285714285714285714285714285714
11, 0.090909090909090909090909090909091
13, 0.076923076923076923076923076923077
17, 0.058823529411764705882352941176471
19, 0.052631578947368421052631578947368
23, 0.043478260869565217391304347826087
29, 0.034482758620689655172413793103448
31, 0.032258064516129032258064516129032
...
绿色夹克衫 2009-11-03
  • 打赏
  • 举报
回复
恩,5楼说的很好了,没啥可补充的,复杂度最高的地方还是在质数验证及因式分解部分。

不知道待分解的数有多大,效率达到n^1/2肯定是可以的,
质数验证部分现在有准确的固定时间的判定方法。不过分解部分最坏情况下效率还是比较低。
gaoyangboy 2009-11-03
  • 打赏
  • 举报
回复
呵呵。 楼主你可以少谦虚点哦。
fire_woods 2009-11-03
  • 打赏
  • 举报
回复
所以我只写了一句话.
zeroieme 2009-11-03
  • 打赏
  • 举报
回复
11的例子还可以,到后面就不懂了。全都Copy上来了。
zeroieme 2009-11-03
  • 打赏
  • 举报
回复
首先a/b要约分成互质,为m/n,那么m/n与1/n循环节一样。
把n中的2和5的因式全部去掉,这样不影响循环节长度,剩下的因式记为n1。
根据循环小数化为分数的方法,分母必然是99…9(k个9)=10^k-1,并且n1必然整除10^k-1,这样问题就转化为求满足10^k≡1 (mod n1)的最小正整数k。


首先要说欧拉函数φ(n):欧拉函数是一个定义在正整数上的函数,φ(n)的值等于以下这些整数0、1、2、…、n-1与n互素的数的个数。
由定义知,φ(1)=1,φ(2)=1,φ(3)=2,φ(4)=2,……,当p是素数时,φ(p)=p-1。
欧拉函数的计算方法:设n的标准分解式子是p1^k1·p2^k2·…·pm^km,其中p1、p2、…、pm是互不相等的素数,k1、k2、…、km都是正整数,则φ(n)=n(1-1/p1)(1-1/p2)…(1-1/pm)。
例如φ(10)=10×(1-1/2)×(1-1/5)=4。
欧拉定理:设a、m为整数,m>1,(a,m)=1,则a^φ(m)≡1 (mod m)。
整数的次数:a、m为整数,m>1,(a,m)=1,k是使a^k≡1 (mod m)成立的最小正整数,则k叫做a对模m的次数。
次数定理:设a对模m的次数为k,n是满足a^n≡1 (mod m)的正整数,则k|n。
欧拉函数的计算方法、欧拉定理的证明、次数定理的证明可以找初等数论的书,这里就不发上来了。

由欧拉定理可以得到求1/n循环节长度的方法。
举个简单的例子。
例如n=11,则φ(11)=10,根据欧拉定理10^10≡1 (mod 11),所以循环节长度一定是10的正约数。而10的正约数有1、2、5、10,从小到大逐一检验,得到10^2≡1 (mod 11),所以1/11的循环节长度就是2。



假设a、n是大于1的正整数,p是素数,则a对模p的次数没有什么好办法去求,只能用上面的方法。
其它情形有下面两个定理:
假设a、n是大于1的正整数,n的标准分解式是p1^k1·p2^k2·…·pt^kt,其中p1、p2、…、pt是互不相等的素数,k1、k2、…、kt都是正整数,a对模pi^ki的次数为mi,则a对模n的次数为m1、m2、…、mt的最小公倍数。
如果a、n是大于1的正整数,p是素数,k是正整数,a对模p^k的次数是m,则a对模p^(k+1)的次数是m或pm。
这两个定理也可以从初等数论里找到证明,我也不发上来了。

再举一个例子
539=7^2×11
10对模7的次数为6,那么10对模7^2的次数或者是6或者是42,经计算验证得10对模7^2的次数是42。
10对模11的次数为2。
所以10对模539的次数为2和42的最小公倍数,即42,所以1/539的循环节长度为42。


《数论导引》里的差不多就是这些内容了,到现在为止求循环节长度的解法已经全部发上来了。
加载更多回复(3)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧