Re: [問題] 有趣的問題~求無限小數

看板C_and_CPP作者 (GAY版很噁心)時間15年前 (2010/05/29 17:02), 編輯推噓2(2019)
留言21則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《winterboy209 (鼕鼕)》之銘言: : 給定一分數,求出此分數以十進位數字表示小數部分循環的數字(第一次循環) : ex:輸入:1/14 : 輸出714285 : (因為1/14=0.0714285714285714285) : 以Microsoft 6.0 c++ 撰寫 : 完全不知道如何下手....拜託了謝謝 我用嘴巴幫你寫吧... 先想到的是,怎麼判斷循環... 1. 就給他除, 除了之後找重複出現的字串...? 這樣好像有道理, 可是實際上不對... 例如 1231231234/10000000=123.1231234 你會看到123 123,就以為他是循環... 阿要是後面那個4超過double的精準度...就錯了。 2. 那就自己寫除法。 z=0 x=1 y=14 m=0 z=0.1 x=10 y=14 m=0 z=0.01 x=100 y=14 m=0 --> 除 m= 100-14*7=2 m是餘數, z 不是商, 因為商不重要, 只是讓你知道除到第幾位 z=0.001 x=2 y=14 m=0 所以,只要x < y, 就把x*10, 記錄一下商(因為等一下商就是循環) 然後把x換成除完的餘數... 一直遇到餘數等於原來的被除數, 就是一個循環了 因為, 餘數 = 1的話, 照樣要除以14, 只是小了 10^n 倍而已... 所以當然也會一直循環... -- 2009年 愛滋感染人數統計 異性性行為女 42 異性性行為男 273 同性性行為男 895 台灣2005年起實施孕婦非強迫愛滋篩檢,2008年起強制新生兒篩檢。 每年有約1%的孕婦接受篩檢,每年有大於1%的異性性行為者接受篩檢。 同性戀人口雖然只佔5%-10%,但是因為接受篩檢的比例是異性戀 1%的好幾好幾倍 所以陽性的人口數才會看起來好像比較多 詳情請看ptt.cc L_BoyMeetsGi 版 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.74.186.67

05/29 17:27, , 1F
遇到同一被除數就跳出感覺怪怪的 例如0.242323242323...
05/29 17:27, 1F

05/29 17:39, , 2F
或0.2222422224...之類的 所以覺得算到小數後第60位後
05/29 17:39, 2F

05/29 17:41, , 3F
再用字串判斷第一次循環小數是多少
05/29 17:41, 3F

05/29 17:56, , 4F
遇到同一被除數就會循環了
05/29 17:56, 4F

05/29 17:57, , 5F
一樓應該是有什麼地方弄錯了
05/29 17:57, 5F

05/29 18:02, , 6F
你說的 0.242323242323... = 242323/999999
05/29 18:02, 6F

05/29 18:03, , 7F
0.2222422224 = 22224/99999
05/29 18:03, 7F

05/29 18:03, , 8F
0.2222422224... = 22224/99999
05/29 18:03, 8F

05/29 18:03, , 9F
自己用長除法除一下就知道這個做法是對的
05/29 18:03, 9F

05/29 18:04, , 10F
1/6=0.166666666666666666 輸出6
05/29 18:04, 10F

05/29 18:04, , 11F
用商數來判斷循環基本上就是錯的
05/29 18:04, 11F

05/29 18:05, , 12F
就算你算到60位還是可能錯
05/29 18:05, 12F

05/29 19:44, , 13F
儲存每一次的商數+被除數,ACM測資循環破千位。
05/29 19:44, 13F

05/29 21:45, , 14F
一樓,我是說同一個被除數,不是同一個商,
05/29 21:45, 14F

05/29 21:45, , 15F
不然隨便小數點下十位就over了
05/29 21:45, 15F

05/30 23:44, , 16F
假設分數是 m/n , 由於除以n最多只會有 0~n-1 這些餘數
05/30 23:44, 16F

05/30 23:45, , 17F
設個 flag[n] , 初始為0, 如果做長除法時某個餘數出現
05/30 23:45, 17F

05/30 23:46, , 18F
某個餘數r出現在位置p
05/30 23:46, 18F

05/30 23:47, , 19F
if(flag[r]==0) flag[r]==p;
05/30 23:47, 19F

05/30 23:47, , 20F
else 這個餘數之前出現過, 因此有循環小數!
05/30 23:47, 20F

05/31 00:15, , 21F
05/31 00:15, 21F
文章代碼(AID): #1C0DWXtH (C_and_CPP)
文章代碼(AID): #1C0DWXtH (C_and_CPP)