码迷,mamicode.com
首页 > 其他好文 > 详细

HLG1125 循环小数2

时间:2015-08-26 19:46:52      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

循环小数 II
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 155(55 users) Total Accepted: 92(51 users) Rating: 技术分享技术分享技术分享 Special Judge: No
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;
}

 

HLG1125 循环小数2

标签:

原文地址:http://www.cnblogs.com/13224ACMer/p/4761392.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!