您的位置:首页 > 其它

HDOJ1717 小数化分数2

2015-07-27 22:45 218 查看
小数化分数2

Time Limit:1000MS Memory Limit:32768KB 64bit
IO Format:%I64d & %I64u

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

小数(除了无限不循环小数外)都可以化成分数。

1.将有限小数化成分数,方法如下:0.25 * 100 = 25;0.25 = 25 / 100(约分即可得到0.25的小数表示);

2.将循环小数化成分数,方法如下:

0.32(692307) * 100 = 32.692307①;

0.32(692307) * 10 ^ 8 = 32692307.(692307)②;

② - ①得:0.32(692307)* (10 ^ 8 - 100) = 32692275;

0.32(692307) = 32692275 / (10 ^ 8 - 100)(约分即可得到0.32(692307)的小数形式)。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef set<int> si;
char str[50];
void gcd(int& mol,int& den)
{
int t,x=mol,y=den;
while(x>0)
{
t=x;
x=y%x;
y=t;
}
mol/=y;
den/=y;
}
int getint(char* str,int pos)
{
int num=0;
for(int i=2; i<=pos+1; i++)
num=num*10+str[i]-48;
return num;
}
int main()
{
int n,cnt;
cin>>n;
while(n--)
{
cnt=0;
cin>>str;
int i=0,pos;
while(str[i]!='\0'&&str[i]!='(')
i++;
if(str[i]=='\0')
{
int mol=getint(str,i-2);
int den=pow(10.0,i-2);
gcd(mol,den);
cout<<mol<<'/'<<den<<endl;
}
else
{
int k=i-1;
pos=i;
while(str[k]!='\0')
{
k++;
str[k]=str[k+1];
}
while(str[i]!=')')
{
cnt++;
i++;
}
str[i]='\0';
int num1=getint(str,pos+cnt-2);
int num2=getint(str,pos-2);
int mol=num1-num2;
int den=pow(10.0,pos-2)*(pow(10.0,cnt)-1);
gcd(mol,den);
cout<<mol<<'/'<<den<<endl;
}
}
return 0;
}


原文
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: