小數轉換分數
小數轉換分數
小數轉換成分數的時候,是讓小數有更精確的表示。這個問題可以分兩種情況來解決:有限小數和迴圈小數。
對於有限小數:
我們可以直接把後面的a作為分子,分母就是10^n,然後再約分。約分就是求分子和分母的最大公約數,然後除以它就可以了。最大公約數的問題我們可以通過輾轉相除法來做(會面會講到其他更加高效的方法求最大公約數)。
對於迴圈小數:
迴圈的部分用括號括起來的。
求分子和分母的數值,需要用個數學的方法。這部分程式設計之美上講的比較清楚,如下:
程式碼如下,有幾點需要注意的:
- 程式中求兩個數的最大公約數用的是輾轉相除法;
- 由於會遇到一些大數,程式中我們使用的是VC環境下的__int64型別,所以輸入輸出格式是printf的%I64d,記住是I不是l。。。一開始總是弄錯,,,
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
// 求最大公約數函式
__int64 gcd(__int64 a, __int64 b)
{
__int64 m;
for(m = a % b; m != 0; m = a % b)
{
a = b;
b = m;
}
return b;
}
int main()
{
string input;
while(cin>>input)
{
int indexDot = input.find('.') + 1; // 小數點的位置
int indexXH = input.find('('); // 迴圈位的位置
bool flag = false;
if(indexXH != string::npos)
{
flag = true; // 說明有迴圈位
indexXH++;
}
// 有限小數轉分數
if(!flag)
{
int lenDecimal = input.length() - indexDot;
string decimal = input.substr(indexDot, lenDecimal);
__int64 up = atoi(decimal.c_str()); // 得到分子
//cout<<lenDecimal<<' '<<up<<endl;
__int64 down = pow(10, lenDecimal);
__int64 common = gcd(up, down);
printf("分子是:%I64d\t分母是:%I64d\n", up/common, down/common);
}
// 迴圈小數轉分數
else
{
int n = indexXH - indexDot - 1; //非迴圈位的長度
int m = input.length() - indexXH - 1; // 迴圈位的長度
string strN = input.substr(indexDot, n);
string strM = input.substr(indexXH, m);
int num1 = atoi(strN.c_str());
int num2 = atoi(strM.c_str());
//cout<<num1<<' '<<num2<<' '<<m<<' '<<n<<endl;
__int64 up = num1 * (pow(10, m) - 1) + num2;
__int64 down = (pow(10, m) - 1) * pow(10, n);
//printf("%I64d\t%I64d", up, down);
__int64 common = gcd(up, down);
printf("分子是:%I64d\t分母是:%I64d\n", up/common, down/common);
}
}
return 0;
}
參考:
http://baike.baidu.com/link?url=bKd5HZCm59WATWhZu6YVXzFqQZIN3yLovxVcja-rneHw7uzRDCXheB_aVdExiGDsxfgp7lw_c2LQMap3qGScV_
http://baike.baidu.com/link?url=bKd5HZCm59WATWhZu6YVXzFqQZIN3yLovxVcja-rneHw7uzRDCXheB_aVdExiGDsxfgp7lw_c2LQMap3qGScV_
https://msdn.microsoft.com/zh-tw/library/29dh1w7z.aspx
相關文章
- Excel表格怎麼將小數轉換成百分數?Excel
- AD模數轉換&DA數模轉換
- Python 轉換金額數字大寫為數字小寫Python
- js小數轉整數JS
- 166. 分數到小數
- JavaScript字串轉換數字JavaScript字串
- Spring Boot 引數轉換Spring Boot
- 字串轉換整數(atoi)字串
- 變數型別轉換變數型別
- 轉換成浮點數
- 轉換成為整數
- matlab符號運算結果的分數怎麼轉化為小數Matlab符號
- js 將負數或小數轉成正整數JS
- Java將秒數轉換成X時X分X秒格式Java
- string與數字相互轉換
- Pytorch變數型別轉換PyTorch變數型別
- 中文數字阿拉伯數字相互轉換
- java將IP地址轉換為數字以及逆向轉換Java
- hex轉浮點數線上轉換工具
- leedcode-數字轉換為十六進位制數
- JavaScript 字串轉換數值型別JavaScript字串型別
- STM32-ADC模數轉換
- Python數字轉換中文大寫Python
- python實現字串轉換整數Python字串
- Thymeleaf將字串轉換為數字字串
- 【Go】IP地址轉換:數字與字串之間高效轉換Go字串
- elixir小技巧:把浮點數轉換為 IEEE754 的 binary 形式
- 數字分頻器設計(偶數分頻、奇數分頻、小數分頻、半整數分頻、狀態機分頻|verilog程式碼|Testbench|模擬結果)
- String to Integer (atoi) 字串轉換整數 (atoi)字串
- 阿拉伯-漢字-數字轉換
- PHP 將數字轉換為漢字PHP
- Javascript基礎:變數型別轉換JavaScript變數型別
- 數字型別的不正確轉換漏洞型別
- 【.NET 與樹莓派】數模轉換樹莓派
- PHP 阿拉伯數字和中文數字的相互轉換PHP
- 程式設計師福音-英文大小寫轉換,駝峰下劃線空格小數點互轉程式設計師
- 將金錢數額轉換為大寫
- 進位制數轉換方法(八/十六/十)
- c++中數字和字串的轉換C++字串