作者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
→ tomas0011:還是很慢 只能判斷 個位數相乘的時候是不是最右邊的 11/26 13:06
→ tomas0011:是 (t^a-1) 最右邊 那位數 盡可能跳過不需要的位數0.0 11/26 13:06
推 gofin:因為沒有實際下去寫!所以不是很明確知道會錯在哪... 11/26 13:53
→ gofin:但是!我覺得因式分解應該是可以減少很多演算的步驟 11/26 13:54
→ gofin:至於大數因數分解可以去做一個質數陣列來處理 11/26 13:58
→ gofin:質數陣列 列出小於 2147483647即可(這質數表應該網路查的到) 11/26 14:00
→ tomas0011:剛上完英文課 腦袋一直想 我又想到方法了... 修改文章XD 11/26 15:25
※ 編輯: tomas0011 來自: 140.130.37.170 (11/26 15:47)
※ 編輯: tomas0011 來自: 140.130.37.170 (11/26 15:53)
推 gofin:但是這樣的前提是要能整除... 11/26 16:41
→ tomas0011:恩 這題 是要顯示能整除 且100位以內 11/26 16:46
→ tomas0011:要顯示小數的話 我不知道要怎麼破解了ˊˋ|| 11/26 16:47
→ tomas0011:其實好像也可以 這個方法可以求到餘數 11/26 16:57
→ tomas0011:求到餘數之後 本來判斷尾數 改成判斷首數(以不超過 11/26 16:58
→ tomas0011:或者相等的成積) 11/26 16:58
→ tomas0011:來求小數 11/26 16:59
推 gofin:喔我的意思是說上面的範例是因為剛好可以整除所以好解.. 11/27 00:21
→ tomas0011:對了我這題有PO在Prob_solve版 有人有解法"輾轉相除法" 11/27 00:28
推 gofin:嗯!好方法!我的是程式寫法!但是一樣都是求最大因數的 11/27 10:13
→ gofin:我那兩層if就是最大因數!! 用gcd的function也可以~ 11/27 10:15
→ gofin:好久沒算數學都忘記還有gcd!!呵...PTT果然強者很多.... 11/27 10:16