程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU1717--小數化分數2

HDU1717--小數化分數2

編輯:C++入門知識

這道題是將輸入的小數(有可能是無限循環小數)來化為分數,剛開始看到以為枚舉(千萬不要嘲笑我),但是感覺不對,

所以百度了小數化為分數的方法,然後看到了各種方法,原來是這這樣,在這我采用的是小數化為分數的套公式法


純循環

用9做分母,有多少個循環數就幾個9,比如0.3,3的循環就是9分之3,0.654,654的循環就是999分之654, 0.9,9的循環就是9分之9(1),以此類推。

混循環 先來看幾個例子 例:把混循環小數0.228˙化為分數: 解:0.228˙ =[(228/1000)+8/9000)] =228/(900+100)+8/9000 =[(228/900)-(228/9000)]+(8/9000) =(228/900)+[(8/9000)-(228/9000)] =(228/900)-(22/900) =(228-22)/900 =206/900 =103/450; 例:把混循環小數0.123˙68˙化成分數: 解:0.123˙68˙=(0.12368+0.00000˙68˙) =(12368/100000)+(68/9900000) =[(12368/99000)-(12368/990000)]+(68/9900000) =(12368/99000)+[(68/9900000)-(12368/9900000)] =(12368/99000)-(12300/9900000) =(12368-123)/99000 公式 用9和0做分母,首先有幾個循環節就幾個9,接著有幾個沒加入循環的數就加幾個0,再用小數點後面的數減 沒加入循環的數,比如0.43,3的循環,有一位數沒加入循環,就在9後面加一個0做分母,再用43減4做分子,得 90分之39,0.145,5的循環就用9後面加2個0做分母,再用145減14做分子,得900分之131,0.549,49的循環,就 用99後面加1個0做分母,用549減5做分子,最後得990分之545,以此類推,能約分的要化簡。

看過上面的覺得大家就知道怎麼將各種小數轉換為分數的方法了

然後就是代碼實現了,如果理解了上面的方法,其實剩下的就是字符串的處理,最後大家不要忘就是化簡得到的分數就可以了,化簡其實就是求分子和分母的最大公約數,處理後進行轉換就OK了哈!

貼一下自己的代碼哈!

#include 
#include 
using namespace std;
//求最大公約數
int gcd(int a , int b)
{
	int t;
	if(a < b)
	{
		t = a;
		a = b;
		b = t;
	}
	while(b > 0)
	{
		t = b;
		b = a%b;
		a = t;
	}
	return a;
}
int main()
{
#ifdef LOCAL
	freopen("input.txt" , "r" , stdin);
#endif
	int T;
	cin >> T;
	string str;
	while(T--)
	{
		cin >> str;
		int primLength = 0 , lastLength = 0 , primValue = 0 , lastValue = 0;
		bool flag = false;
		int fenzi = 1 , fenmu = 1;
		//處理輸入的小數字符串
		for(int i=2; i= '0' && str[i] <= '9')
			{
				if(flag)
				{
					lastLength++;
					lastValue = lastValue * 10 + (str[i] - '0');
				}else{
					primLength++;
					primValue = primValue * 10 + (str[i] - '0');
				}
			}
		}
		//對無限循環的和不循環的分別處理
		if(flag)
		{
			int temp = primValue;
			int sum = 0;
			while(lastLength--)
			{
				temp = temp * 10;
				sum = sum*10 + 9;
			}
			fenzi = temp + lastValue - primValue;
			fenmu = sum;
			while(primLength--)
			{
				fenmu = fenmu * 10;
			}
			//進行輸出
			cout << fenzi/gcd(fenzi , fenmu) << "/" << fenmu/gcd(fenzi , fenmu) << endl;
		}else{
			while(primLength--)
			{
				fenmu*=10;
			}
			//進行輸出
			cout << primValue/gcd(fenmu , primValue) << "/" << fenmu/gcd(fenmu , primValue) << endl;
		}
	}
	return 0;
}





  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved