1. 程式人生 > >一種小數轉分數的演算法(不限整除)C++

一種小數轉分數的演算法(不限整除)C++

最近需要用到小數轉分數演算法,便研究了一下。

先看一下最終程式的效果:
最終效果圖

說一下數學中有理小數轉分數的過程:
有理小數分為有限小數和無限迴圈小數

1. 有限小數:

有限小數直接去小數點再約分即可。

例:1.55=155100=3120

2. 無限迴圈小數:

先判斷迴圈節長度n,原小數a乘以10n後再減去a可化為有限小數。

例:1.8123123...

a=1.8123123...

迴圈節為123,一共三位,乘以103

103a=1812.3123123...

兩式相減可得999a=1810.5

a=1810.5999=181059990=1207666

剛開始想使用上述方法,於是做了一些實驗。
計算器算了分數,123/321=0.38317757009345794392523364485981,可見,123、321這兩個數並不是很大,但是相除後得到的小數迴圈節過長,一個double型別尾數長度是52bit,對應十進位制只有15~16位的精度,不能保證用演算法分析出迴圈節的長度,上述方法不適用。下面使用連分數做轉換。

使用連分數做轉換

一、連分數的定義:

形如a0+1a1+1a2+1a3+1...的分式叫做連分式,記為[a0;a1,a2,a3,...]
有理數(整數、有限小數、無限迴圈小數)的連分式是有限的。

二、有理數與連分數的轉換:

1. 分數或小數轉換為連分數

步驟1:令a=這個數,即a←這個數;
步驟2:將a的整數部分⌊a⌋記錄下來;
步驟3:令a為a的小數部分,即a←a-⌊a⌋;
步驟4:如果a≠0,跳轉到步驟2,否則向下執行步驟5;
步驟5:步驟2中記錄的數即為連分數的[a0;a1,a2,a3,...]
例如將3211232.6097560975...轉換為連分數,步驟如下表:

321123 2.6097560975...
321123=275123 2.6097560975...=2+0.6097560975
1/0.6097560975...=1.64
12375=14875 1.64=1+0.64
1/0.64=1.5625
7548=12748 1.5625=1+0.5625
1/0.5625=1.7777...
4827=12127 1.7777...=1+0.7777...
1/0.7777=1.285714285714...
2721=1621 1.285714285714...=1+0.285714285714...
1/0.285714285714...
=3.5
216=336=312 3.5=3+0.5
1/0.5=2
21=2 2=2+0


可見321123=[2;1,1,1,1,3,2]=2+11+11+

相關推薦

小數分數演算法整除C++

最近需要用到小數轉分數演算法,便研究了一下。 先看一下最終程式的效果: 說一下數學中有理小數轉分數的過程: 有理小數分為有限小數和無限迴圈小數 1. 有限小數: 有限小數直接去小數點再約分即可。 例:1.55=155100=3120 2

Oracle中,用條Sql實現任意的行列拼接是decode

說明一下測試環境:Oracle9i,有朋友說10g上測試結果不正確,本人沒有條件,所以無法進行測試 表結構和資料如下(表名Test): NO VALUE  NAME 1       a       測試1 1       b       測試2 1       c       測試3 1       d 

順序儲存結構線性表的各種演算法定時補充

儲存結構 如下。 //儲存結構 #define MAXSIZE 100 typedef struct { int elem[MAXSIZE]; int last; //末尾元素下標 } SeqLi

相對自適應表格relative responsive table並且第一列凍結的方法

轉載:http://caibaojian.com/relative-responsive-table 需求分析 該樣式的主要需求分析是這樣子的:一個表格,有很多列內容,超出了螢幕的最大寬度,如果不做處理的情況下,瀏覽器會多出一個滾動條,所以我們需要改為沒有滾動條,同時可以查看錶格的內容。這個常常

去除字串中所有的非英文字元,再統計每英文字元的個數區分大小寫

import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestString {public static void mai

HDU 1717 小數分數2數學基本知識

Sample Output 4/9 1/2 17/52 【思路分析】   該題的關鍵點就是迴圈小數化為分數,有一個結論,假如這個迴圈小數是0.(1234),其化為分數即為1234/9999,也就是迴圈的部分除以這個迴圈部分長度個9,即1234除以4個(1234的長度)9。證明如下:   設這個迴圈小數x為0.

Impala實踐之十四:次Impala節點故障記錄能啟動

前言 Impala叢集中有兩臺機器的Impala Daemon不能正常啟動,記錄一下整個過程和解決方式。 過程 階段一 Impala叢集的狀態開始飄紅,有兩臺節點不能正常使用。 這時候發現叢集裡面有十多個任務正在執行,任務執行時間很長,情況非常

Linux Socket編程Linux

bar fopen 博物館 ont ipaddr mem 綁定 轉換成 network 話雖些許誇張,但是事實也是,現在的網絡編程幾乎都是用的socket。 ——有感於實際編程和開源項目研究。 我們深諳信息交流的價值,那網絡中進程之間如何通信

Linux多執行緒程式設計Linux多執行緒操作

——本文一個例子展開,介紹Linux下面執行緒的操作、多執行緒的同步和互斥。 前言 執行緒?為什麼有了程序還需要執行緒呢,他們有什麼區別?使用執行緒有什麼優勢呢?還有多執行緒程式設計的一些細節問題,如執行緒之間怎樣同步、互斥,這些東西將在本文中介紹。我在某QQ群裡見到這樣一道面試題: 是否熟悉POS

Linux Socket程式設計Linux

“一切皆Socket!” 話雖些許誇張,但是事實也是,現在的網路程式設計幾乎都是用的socket。 ——有感於實際程式設計和開源專案研究。 我們深諳資訊交流的價值,那網路中程序之間如何通訊,如我們每天開啟瀏覽器瀏覽網頁時,瀏覽器的程序怎麼與web伺服器通訊的?當你用QQ聊天時,QQ程序怎麼與伺服器或你好友所

垃圾回收演算法看後悔,看必懂

標記-清除演算法(Mark-Sweep) 1、標記出所有需要回收的物件 2、在標記完成後統一回收所有被標記的物件 缺點:一個是效率問題,標記和清除兩個過程的效率都不高; 另一個是空間問題,標記清除之後會產生大量不連續的記憶體碎片,空間碎片太多可能會導致以後在程式執

2018-3-20論文新型的智慧演算法-狼群演算法WPA筆記二狼群系統分析,演算法步驟

狼群系統分工:頭狼: 狼群中最有智慧以及最凶猛的。它不斷的根據狼群所感知的資訊進行決策,身份:行動的指揮者探狼:負責偵查資訊,感知獵物的氣味。在進行實物搜尋的階段,會派出一些探狼(只是一小部分)去偵測資訊,他們會根據偵測到的資訊進行自主決策,向著獵物氣味最近的方向前進。猛狼:

卷積神經網路入門一種全卷積神經網路LeNet,從左至右依次為卷積→子取樣→卷積→子取樣→全連線→全連線→高斯連線測試 最後,為了檢驗 CNN 能否工作,我們準備不同的另組圖片與標記集(不能在訓練

轉載來自:http://blog.csdn.net/maweifei/article/details/52443995 第一層——數學部分 CNN 的第一層通常是卷積層(Convolutional Layer)。輸入內容為一個 32 x 32 x 3 的畫素值陣列。現在

常用的排序演算法--python實現

1. 選擇排序,時間複雜度O(n^2),演算法不穩定。     思路:(1)迴圈整個陣列 arr,選出最大的數,將它放在空陣列 new_arr 的第一個位置。                (2)將剛

常見的濾波演算法

1、限幅濾波法(又稱程式判斷濾波法) A、方法: 根據經驗判斷,確定兩次取樣允許的最大偏差值(設為A) 每次檢測到新值時判斷: 如果本次值與上次值之差<=A,則本次值有效 如

hdu 1717 小數分數2 迴圈小數分數

本題可推出公式 首先跟你一個小數 令X= 0 . s1 s2 ..sn ( y1 y2 y3..ym ) 這樣的話我們把小數點分為三個部分,分別用三種顏色標記了! 我們可以把表示式轉換成:X * 10 ^n=s1s2..sn+0.y1y2..ym;    我們用S

JS全排列的7演算法總結重複元素

全排列是一種時間複雜度為:O(n!)的演算法。所有演算法均使用JavaScript編寫,可直接執行。 演算法一:迴圈,一組排列需要幾個元素就用幾個for(比較笨拙的方法) 1 2 3 4 5 6

Excelhtml帶圖片

size conf mage 技術 prop ack output tex out 這種方法,比較不合時宜。因此,直接貼出代碼,只做記錄。 package com.css.java.learning.massbag; import java.io.BufferedWrit

[置頂]搜尋引擎-提示詞推薦演算法

      搜尋引擎可以說目前所有網際網路應用裡技術含量最高的一種。儘管應用形式比較簡單:使用者輸入查詢詞,搜尋引擎返回搜尋結果。但是,搜尋引擎需要達到的目標:更全、更快、更準。如何讓搜尋結果更準確始終是搜尋引擎的一大難題。   公司最近在開發某行業的垂直搜尋引

文弄懂動態規劃DP Dynamic Programming下樓梯,國王和金礦,揹包問題,Dijkstra演算法

動態規劃 參考連結 漫畫演算法,什麼是動態規劃? DP 動態規劃是一種分階段求解決策問題的數學思想 題目一 問:下樓梯問題,有一座高度是10級臺階的樓梯,從下往上走,每跨一步只能向上1級或者2級臺階,請問有多少中走法。 思路 剛才這個題目,你每走一步就有兩