zoukankan      html  css  js  c++  java
  • HLG1125 循环小数2

    循环小数 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
    ",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
    ",yy,xx);
               else
               printf("%d/%d
    ",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
    ",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
    ",x2,y2);
               else
               printf("%d/%d
    ",x2/yue,y2/yue);
    
           }
    
           memset(str,0,sizeof(str));
        }
        return 0;
    }
  • 相关阅读:
    FreeSql.Repository (九)级联保存
    FreeSql.Repository (八)级联加载
    FreeSql.Repository (七)多表查询
    FreeSql.Repository (六)导航属性
    FreeSql.Repository (五)状态管理
    FreeSql.Repository (四)工作单元
    FreeSql.Repository (三)实体特性
    FreeSql.Repository (一)什么是仓储
    [开源] .Net 使用 ORM 访问 华为GaussDB数据库
    24位PCM采样数据转成16位算法,已实现PCM转WAV在线工具源码支持24bits、16bits、8bits
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/4761392.html
Copyright © 2011-2022 走看看