11076 浮点数的分数表达
Description
在计算机中,用float或double来存储小数有时不能得到精确值,若要精确表达一个浮点数的计算结果, 最好用分数来表示小数,有限小数或无限循环小数都可以转化为分数,无限循环小数的循环节用括号标记出来。如: 0.9 = 9/10 0.(3) = 0.3(3) = 0.3(33) = 1/3 当然一个小数可以用好几种分数形式来表示,我们只感兴趣最简的分数形式(即分母最小),如: 0.3(33) = 1/3 = 3/9 因为任何一个数都可以转化为一个整数和一个纯小数之和,整数部分较为简单无需做额外处理,只要将纯小数部分转化为分数形式,整数部分的分数部分就很简单了。 现在给定一个正的纯小数(这个纯小数为有限小数或无限循环小数),请你以最简分数形式来返回这个纯小数。
Input
给定一个纯小数,若是无限循环小数,用括号标记循环节,输入小数表达不超过100个字符。
Output
输出:化为最简分数形式,分子在前,分母在后,中间空格连接。
Sample Input
0.3(33)
Sample Output
1 3
![浮点数的分数表达 浮点数的分数表达](https://i-blog.csdnimg.cn/blog_migrate/5cade3fc0d5534dbd754eb49d964629c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/26a628fcd5a58fa93dd4edd135555ffb.png)
=============================
(注:long long 是提交系统所需,在VC6.0下需该为 __int64 相应的输入输出格式为 %I64d )
ps.
主要是longlong 类型要特别处理 不能用pow()
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
using namespace std;
long long GCD(long long bigNum,long long sNum) //辗转相除返回除数
{
if(bigNum < sNum)
return GCD(sNum,bigNum);
long long res;
if(sNum==0)
return bigNum;
res = bigNum%sNum;
while(res)
{
bigNum = sNum;
sNum = res;
res = bigNum%sNum;
}
return sNum;
}
int isNum(char str[])
{
for(int i=2; i<strlen(str); i++)
{
if(str[i]>'9'||str[i]<'0')
return false;
}
return true;
}
int findCh(char str[],char ch)
{
for(int i=2; i<strlen(str); i++)
{
if(str[i]==ch)
{
return i;
}
}
return 0;
}
int main()
{
char num[128];
scanf("%s",&num);
/*if(!isNum(num)){
printf("%s","请输入正确数据!!");
return 0;
}*/
int len = strlen(num);
long long num1=0;
long long num2;
if(findCh(num,'(')==0)
{
for(int i=2; i<len; i++)
{
num1=num1*10+num[i]-'0';
}
//printf("%ld\n",num1);
num2=1;
for(int i=2; i<len; i++)
{
num2 *= 10;
}
//printf("%ld\n",num2);
long long gcd = GCD(num1,num2);
num1 /=gcd;
num2 /=gcd;
printf("%lld %lld\n",num1,num2);
// cout << num1 << endl;
}
else
{
int start =findCh(num,'(');
int end =findCh(num,')');
int n = start-2;
int m = end - start - 1;
//printf("%d %d\n",m,n);
for(int i=2; i<start; i++)
{
num1=num1*10+num[i]-'0';
}
//printf("%ld\n",num1);
num2=0;
for(int i=start+1; i<len-1; i++)
{
num2=num2*10+num[i]-'0';
}
//printf("%ld\n",num2);
long long mp = 1;
for(int i=0; i<m; i++)
{
mp *=10;
}
long long np = 1;
for(int i=0; i<n; i++)
{
np *=10;
}
num1 = num1*(mp-1)+num2;
num2 = (mp-1)*np;
long long gcd = GCD(num1,num2);
num1 /=gcd;
num2 /=gcd;
printf("%lld %lld\n",num1,num2);
}
return 0;
}