11076 浮点数的分数表达_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 11076 浮点数的分数表达

11076 浮点数的分数表达

 2014/10/21 21:15:08  DannyYo  程序员俱乐部  我要评论(0)
  • 摘要:11076浮点数的分数表达Description在计算机中,用float或double来存储小数有时不能得到精确值,若要精确表达一个浮点数的计算结果,最好用分数来表示小数,有限小数或无限循环小数都可以转化为分数,无限循环小数的循环节用括号标记出来。如:0.9=9/100.(3)=0.3(3)=0.3(33)=1/3当然一个小数可以用好几种分数形式来表示,我们只感兴趣最简的分数形式(即分母最小),如:0.3(33)=1/3=3/9因为任何一个数都可以转化为一个整数和一个纯小数之和
  • 标签:

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; }

?

  • 相关文章
发表评论
用户名: 匿名