Problem 2193 So Hard
Accept: 49 Submit: 130
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
请将有限小数化为最简分数。
Input
一个整数n 表示需要转化的小数个数; 接下来n行,每行有一个有限小数。(保证小数位数不超过9位)
Output
输出有n行,每行为小数对应的最简分数
Sample Input
20.50.4
Sample Output
1/22/5
Hint
注意精度问题,数据保证不会有类似1.0的小数。Source
福州大学第十二届程序设计竞赛
题意:如题。
做法:最主要的是要注意精度,如果只用double的话,数的位数超过17位的话,精度就会丢失,所以得用字符串输入。我用的是num1.num2分别输入,num1我是用longlong输入,num2则是用字符串输入,然后求出num2的位数记为n,那么fm就是10^n,fz则为num2+fm*num1,然后用gcd求出最大公约数,化简即可。
#include <iostream>
#include <cstdio>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#define esp 1e-6
#define inf 0x0f0f0f0f
#define LL long long
using namespace std;
long long gcd(long long da,long long xiao)
{
if(da%xiao==0)
return xiao;
else
return gcd(xiao,da%xiao);
}
int main()
{
int t,i,j;
long long fm,fz,g;
long long num1,num2,a,b,c;
char s2[105];
int l;
scanf("%d",&t);
while(t--)
{
scanf("%I64d.%s",&num1,s2);
//printf("*%I64d %s\n",num1,s2);
l=strlen(s2);
num2=0;
for(i=0;i<l;i++)
num2=num2*10+(s2[i]-'0');
// printf("%I64d\n",num2);
a=1;
for(i=0;i<l;i++)
a=a*(long long)10;
fm=a;
fz=num2+a*num1;
//printf("*%f %f %f %I64d %I64d\n",c,b,a,fz,fm);
g=gcd(fz,fm);
fz=fz/g;
fm=fm/g;
printf("%I64d/%I64d\n",fz,fm);
}
}