迴圈小數轉化為分數

2021-06-19 08:27:25 字數 3170 閱讀 9217

眾所周知迴圈小數是可以轉化為分數的。

把迴圈小數轉化為分數一般用極限的方法,比如0.33333........,可以看成是0.3+0.03+0.003+.......這個等比數列的值,然後求等比數列的和,設有n個數,則根據等比數列公式得和為0.3*(1-0.1^n)/(1-0.1),化簡得(1-0.1^n)/3,n為無限多個,n趨於無窮大時的極值即為迴圈小數的值,注意了,這個極值就是迴圈小數的值,可不是無限接近迴圈小數的值,舉乙個特殊的迴圈小數0.99999.....,值就是1,因為它等於0.3333......乘以3,而0.33333.....等於1/3,1/3*3等於1,所以0.9999......值就是1。由於迴圈小數的公比肯定小於1,則化簡後的等比數列的和,分子和分母一定是可以化為有限小數的,則分子分母都可以變為整數,這也證明了無限迴圈小數是可以轉化為分數的。

觀察一下迴圈小數(括號裡為迴圈體)和分數:

0.33333...... = 3/9;

0.232323...(23) = 23/99

0.2345234523452345....(2345) = 2345/9999

0.1232323....(23) = 122/990

0.12343434...(34) = 1222/9900 ……

你是否發現了一些規律,歸納如下:

迴圈小數0.abbbb......(a表示數字串,可以為空,b表示迴圈體),a的長度為m,b的長度為n,則化為分數如下:

(ab-a)/(9...)(0...),其中9有n個,0有m個。

如0.12345345345...(345) ,則a為12,b為345,ab為12345,m為2,n為3,則化為分數為(12345-12)/99900。

這裡使用python3程式設計實現這個功能,**如下:

def df2f(n, pos=-1):

"""把小數轉換為分數,可以是迴圈小數,不可以是科學記數法表示的小數

@author: cidplp

@param n:輸入小數,可以帶整數部分

@type n:int或者float

@param pos:小數部分迴圈位置,從0開始,-1表示不迴圈

@type pos:int

@return:返回分子和分母

@rtype:int

"""if isinstance(n, (float, int)) == false:

print('請輸入正確的數字')

return none

part = str(n) #part是n的字串樣子

lpart, sep, rpart = part.partition('.') #lpart是整數部分,sep是小數點,rpart是小數部分

if sep == '':

return int(part), 1

if pos >= len(rpart):

print('迴圈小數字置錯誤')

return none

if pos == -1:

denominator = int('1'+'0'*len(rpart))

if int(lpart) >= 0:

numerator = denominator * int(lpart) + int(rpart)

else:

numerator = denominator * int(lpart) - int(rpart)

return numerator, denominator

else:

rlpart = rpart[0: pos] #小數的非迴圈部分

rrpart = rpart[pos:] #小數的迴圈部分

denominator = int('9'*len(rrpart)+'0'*len(rlpart))

if rlpart == '':

rlpart = '0'

if int(lpart) >= 0:

numerator = denominator * int(lpart) + int(rpart) - int(rlpart)

else:

numerator = denominator * int(lpart) - int(rpart) + int(rlpart)

return numerator, denominator

這樣算出來的結果不一定是最簡的,如果化簡的話使用下面函式約分:

def redu(numerator, denominator):

"""分數約分,如果分子分母有小數,則都變為整數後約分

@author: cidplp

@param numerator:分子

@type numerator:int或float

@param denominator:分母

@type denominator:int或float

@return:約分後分子和分母

@rtype:int

"""a = numerator

b = denominator

if isinstance(a, (int, float)) == false or isinstance(b, (int, float)) == false:

print('請輸入正確的數字')

return none

if b == 0:

print('分母不能為零')

return none

#把a,b化為分數

t1 = df2f(a)

t2 = df2f(b)

#兩分數相乘,分子賦值給a,分母賦值給b

a = t1[0] * t2[1]

b = t1[1] * t2[0]

#判斷a和b是否有負數

if abs(a+b) == abs(a) + abs(b):

flag = 1

else:

flag = -1

a = abs(int(a))

b = abs(int(b))

temp = max(a, b)

i = 2

while i <= min(a, b):

if a % i == 0 and b % i == 0:

a //= i

b //= i

else:

i += 1

return a*flag, b

如何將迴圈小數化為分數

一 無限迴圈小數怎樣化為分數?公式 第一種 這個公式必須將迴圈節的開頭放在十分位。若不是可將原數乘10 x x為正整數 就為 12.121212 0.121212 12 100倍 1倍 99 99和12之間一條分數線 此公式需用兩位數字,其中兩位數差出乙個迴圈節。再舉乙個例子 0.00121212 ...

將無限迴圈小數化為分數

眾所周知,有限小數是十進分數的另一種表現形式,因此,任何乙個有限小數都可以直接寫成十分之幾 百分之幾 千分之幾 的數。那麼無限小數能否化成分數?首先我們要明確,無限小數可按照小數部分是否迴圈分成兩類 無限迴圈小數和無限不迴圈小數。無限不迴圈小數不能化分數,這在中學將會得到詳盡的解釋 無限迴圈小數是可...

分數化迴圈小數(純 混)

網上看到這個問題,查了一下除了字串查詢沒看到別的解法,自己寫了乙個,要考慮一些特殊情況,比如除0,負數等等,時間複雜度n 2,小數點長度n大於一萬就慢了,感覺 還能再優化一下,最多跑過11111111 59595961,一共591萬位,release要跑20秒5g記憶體,再大記憶體就不夠了。寫的亂七...