HDU1717,继续格式化

小数化分数2

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2356    Accepted Submission(s): 963


Problem Description
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
 

Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
 

Output
对每一个对应的小数化成最简分数后输出,占一行。
 

Sample Input
   
   
   
   
3 0.(4) 0.5 0.32(692307)
 

Sample Output
   
   
   
   
4/9 1/2 17/52
 

Source
2007省赛集训队练习赛(2)
 

Recommend
lcy
 

思路:题目十分简单,举个例子即可.不简单的是提交了N遍还是WA,后来上网搜了半天,再把G++提交改成C++提交,居然过了,吭爹啊!!!原来如果要调用某个特定平台的API,c_str(),真是见识少吃亏多啊!

x=0.34(59)

即100x=34.(59)          (1)

10000x=3459.(59)     (2)

(2)-(1),得9900x=3459-34, => x=(3459-34)/9900,记要要化简!算法就是这么简单,实现起来真是坎坷.

#include<iostream>
#include<algorithm>
#include<math.h>
#include<string>
using namespace std;
inline int gcd(int a,int b)
{
	return b==0 ? a : gcd(b,a%b);
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		string str;
		int left=1,right=1;
		cin>>str;
		
		for(int i=0;i<str.size();++i)
		{
			if(str[i] == '(')
				left=i;
			else if(str[i] == ')')
				right=i;
		}

		int unCir = atoi(str.substr(2,left-1).c_str()) ;

		int res = atoi(str.substr(left+1,right-left-1).c_str()) ;
		if(  left == 1)
		{
			int len=str.length()-2;
			if( atoi(str.substr(2,str.length()-1).c_str()) == 0)
			{
				cout<<0<<endl;
				continue;
			}

			cout<<(int)res/gcd(res,pow(10.0,len))<<'/'<<(int)pow(10.0,len)/gcd(res,pow(10.0,len))<<endl;

		}
		else
		{
			double M=pow(10.0,right-3);
			double b=M-pow(10.0,left-2);
			double a=unCir*pow(10.0,right-left-1)+res-unCir;
			cout<<(int)a/gcd(a,b)<<'/'<<(int)b/gcd(a,b)<<endl;

		}
	}
}


你可能感兴趣的:(ACM)