作者tomas0011 (tomas0011)
看板Visual_Basic
标题Re: [VB6 ] Q10083: Division
时间Wed Nov 26 12:53:56 2008
※ 引述《gofin (云色)》之铭言:
: → tomas0011:如果 分子除分母为整数也就是整除!分母则为分子的因数 11/25 22:57
: → tomas0011:问题就来了!要如何把分母(大数)分割 成较小的因数 11/25 22:58
: → tomas0011:而每次除分母因数时判断分子是否变为小数 即为不整除^^? 11/25 22:59
: → tomas0011:可是若途中遇到了超过可以用 "除法直接除的(分母)质数" 11/25 23:01
: → tomas0011:题目又会产生bug罗 !! 好难ˊˋˊˋˊˋˊˋ 11/25 23:01
: 续之前t^(a-b)找出可能的值
: 再把这些值丢进(t^a)-1/(t^b)-1
: 分别算出分子跟分母的数字(这里可能需要大数相乘)
: 如果说有个函数是可以分解一个数字的因式
: EX:输入25会输出5^2 或输入75会输出5^2*3^1
: 这样就把分子跟分母切开送进去.....
: 然後先比较
: if 分子的底数是否包含全部分母的底数
: if 这些相同底数的分子指数都大於分母指数
: 如果有的话(应该就会整除) 就算一算输出答案
: (怎算就是 假设a,b都是分子跟分母都有的底数,c^e,d^f是分子多的
: =a^(分子指数减分母指数)*b^(分子指数减分母指数)*c^e*d^f
: P.S到这其实只是一串底数跟指数的组合,如果需要输出确切的数字就用大数
: 相乘算出来吧,,,,但是我倒觉得算到这边应该就差不多了!
: else
: 分子指数减分母指数会等於负的
: =没办法整除
: end if
: else
: =没办法整除
: end if
: 参考看看
用这个方法可能会牵扯到大数的因数分解
如果分解出来的那个数值又是大数(也就是无法在分割的质数)
又会碰上了相乘的问题
我想到了一个解法
(t^a-1)/(t^b-1)=答案
如果用交差相乘 则 (t^a-1)=(t^b-1)*答案
可能会变成单纯的大数相乘 至於范围
假设(t^a-1)长度为10
(t^b-1)长度为5
以最坏最坏的打算 假设
t^a-1=1000000000
t^b-1=10000
那回圈的范围就会落在长度6 长度7之间
也就是 100000-1000000 也许可能有bug
或是个增加一个范围 长度5到8之间
至於判断答案*(t^b-1) 是否为(t^a-1)
则可以用 t=split(t^b-1*答案,t^a-1)
若 ubound(t)=1 而且 t(0) and t(1) =empty
那答案为正解 若 回圈跑完 还找不到答案
则为小数点
嗯!!可能效率还是很差
谢谢你让我想到一个或许可行的解法~
------------分割限-----------------
来了
就我所说的发展一个可行的
用相乘and相减 找个位数 这三个重点
破解一组答案
先新增一个空白s=""
(这是一组小算盘可以计算的数字)
假设 t^a-1=304696744428557889118768=a
t^b-1=4654954984844849=b
两个相除的结果=65456432=c
至於怎麽推到答案 a/b = c = 65456432
首先 看尾数
b的尾数=9 9*多少=a的尾数8 对乘2=18
把a-b整项*2
304696744428557889118768
- 4654954984844849*2
-------------------------
304696735118647919429070
因为已经求到一位 2 所以把 0消掉(消掉一位)
304696735118647919429070/10
此时 a =30469673511864791942907
s= 2 & s
继续
b的尾数=9 9*多少=a的尾数7 对乘3=27
把a-b整项*3
30469673511864791942907
- 4654954984844849*3
------------------------
30469659546999837408360
求到一位 3 所以把 0 消掉
a又变成了 3046965954699983740836
此时 s= 3 & s
s 内容 = 32
以此类推
最後结果可以推到65456432
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.130.37.170
1F:→ tomas0011:还是很慢 只能判断 个位数相乘的时候是不是最右边的 11/26 13:06
2F:→ tomas0011:是 (t^a-1) 最右边 那位数 尽可能跳过不需要的位数0.0 11/26 13:06
3F:推 gofin:因为没有实际下去写!所以不是很明确知道会错在哪... 11/26 13:53
4F:→ gofin:但是!我觉得因式分解应该是可以减少很多演算的步骤 11/26 13:54
5F:→ gofin:至於大数因数分解可以去做一个质数阵列来处理 11/26 13:58
6F:→ gofin:质数阵列 列出小於 2147483647即可(这质数表应该网路查的到) 11/26 14:00
7F:→ tomas0011:刚上完英文课 脑袋一直想 我又想到方法了... 修改文章XD 11/26 15:25
※ 编辑: tomas0011 来自: 140.130.37.170 (11/26 15:47)
※ 编辑: tomas0011 来自: 140.130.37.170 (11/26 15:53)
8F:推 gofin:但是这样的前提是要能整除... 11/26 16:41
9F:→ tomas0011:恩 这题 是要显示能整除 且100位以内 11/26 16:46
10F:→ tomas0011:要显示小数的话 我不知道要怎麽破解了ˊˋ|| 11/26 16:47
11F:→ tomas0011:其实好像也可以 这个方法可以求到余数 11/26 16:57
12F:→ tomas0011:求到余数之後 本来判断尾数 改成判断首数(以不超过 11/26 16:58
13F:→ tomas0011:或者相等的成积) 11/26 16:58
14F:→ tomas0011:来求小数 11/26 16:59
15F:推 gofin:喔我的意思是说上面的范例是因为刚好可以整除所以好解.. 11/27 00:21
16F:→ tomas0011:对了我这题有PO在Prob_solve版 有人有解法"辗转相除法" 11/27 00:28
17F:推 gofin:嗯!好方法!我的是程式写法!但是一样都是求最大因数的 11/27 10:13
18F:→ gofin:我那两层if就是最大因数!! 用gcd的function也可以~ 11/27 10:15
19F:→ gofin:好久没算数学都忘记还有gcd!!呵...PTT果然强者很多.... 11/27 10:16