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
?
=============================
(注: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;
}
?