小數轉換分數

bigface1234fdfg發表於2015-01-29

小數轉換分數

    

    小數轉換成分數的時候,是讓小數有更精確的表示。這個問題可以分兩種情況來解決:有限小數和迴圈小數。


    對於有限小數:


我們可以直接把後面的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






相關文章