标签:
循环小数 II | ||||||
|
||||||
Description | ||||||
对于一个小数,我们记作0.abcd(efgh),若其中含有括号,则其中用括号包围的是循环数。若不含有括号,则表示的是有限小数。 现在需要你求出给出的小数对应的最简分数表示形式。 |
||||||
Input | ||||||
输入数据每行一个小数,最长非循环位为4位,最长循环数为4位,按照题目描述的方法表示 处理到文件结束 |
||||||
Output | ||||||
输出给出的小数对应的最简分数表示形式 |
||||||
Sample Input | ||||||
0.1
0.(1)
0.8(3)
|
||||||
Sample Output | ||||||
1/10
1/9
5/6
|
||||||
Author | ||||||
齐达拉图 |
其实不难,只需要记住一个转换公式即可,eg:
0.8(142),求该循环小数的分数形式;可以先设置该循环小数的结果为x
则-》8142.(142)==10000x
8.(142)==10x
用第一个方程减去第二个方程便可以求得x
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; char str[20]; int gcd(int a,int b){ if(b==0) return a; else gcd(b,a%b); } int main(){ while(scanf("%s",str)!=EOF){ int sum1=0,sum2=0; // getchar(); int len=strlen(str); // printf("-->%d\n",len); int flag=-1; for(int i=0;i<len;i++){ if(str[i]==‘(‘) flag=i; } if(flag==-1){ int xx=pow(10,len-2); int yy=0; for(int i=2;i<len;i++){ int x=str[i]-‘1‘+1; yy=yy*10+x; } int yue=gcd(yy,xx); if(yue==1) printf("%d/%d\n",yy,xx); else printf("%d/%d\n",yy/yue,xx/yue); } else{ int len1=flag-2; int len2=len-flag-2; int l1=0,l2=0; double r1,r2; r1=pow((double)10,len1+len2); r2=pow((double)10,len1); // printf("--->%d %d %lf %lf\n",len1,len2,r1,r2); for(int i=2;i<len;i++){ if(str[i]>=‘0‘&&str[i]<=‘9‘) l1=l1*10+str[i]-‘1‘+1; } for(int i=2;i<flag;i++){ l2=l2*10+str[i]-‘1‘+1; } int x2=l1-l2; int y2=(int)r1-(int)r2; int yue=gcd(x2,y2); if(yue==1) printf("%d/%d\n",x2,y2); else printf("%d/%d\n",x2/yue,y2/yue); } memset(str,0,sizeof(str)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/13224ACMer/p/4761392.html