• google china code jam round2 div1 1000分题


    直到结束时才去打开看1000分的题究竟什么样。
    原来google还玩了一把心理游戏。
    题目大意:用最简分数表示等价的循环小数。分母必须是正整数
    输入一个长度在3到10个字符(包含)间的字符串:a.b(c)的形式表示一个循环小数
    输入保证下列条件:
    字符仅包含0123456789.()
    a表示整数部分,最多1位数(第2个字符总是'.')
    b表示不循环部分,最少可以是0位
    c表示循环部分,最少可以是0位
    括号必须成对出现或者不出现
    结果返回一个字符串a/b的分数形式。

    测试数据:
    "0.(3)"
    Returns: "1/3"
    "1.3125"
    Returns: "21/16"
    "2.85(23)"
    Returns: "14119/4950"
    "9.123(456)"
    Returns: "3038111/333000"
    "0.111(1)"
    Returns: "1/9"
    "3.(000)"
    Returns: "3/1"

    下面是我后来写的代码。

    #include <string>
    #include 
    <cstdio>
    using namespace std;
    class RecurringNumbers
    {
    public:
        
    int gcd(int a,int b)
        
    {
            
    int t;
            
    if (a<b)t=a,a=b,b=t;
            
    while(b)
            
    {
                t
    =a%b;
                a
    =b;
                b
    =t;
            }

            
    return a;
        }

        
    string convertToFraction(const string &decimalNumber)
        
    {
            
    char buf[32],a[10],b[10];
            
    int lena;
            strcpy(buf, decimalNumber.c_str());
            strcpy(a, strtok(buf, 
    ".()"));
            
    char *= strtok(NULL, ".()");
            
    char *n2 = strtok(NULL, ".()");
            
    if (n2 != NULL)
            
    {
                strcat(a, n);
                strcpy(b, n2);
                lena
    =strlen(n);
            }

            
    else
            
    {
                
    if (strchr(decimalNumber.c_str(), '('))
                
    {
                    lena
    =0;
                    strcpy(b, n);
                }

                
    else
                
    {
                    lena
    =strlen(n);
                    strcat(a, n);
                    strcpy(b,
    "0");
                }

            }

            
    int na=atoi(a);
            
    int nb=atoi(b);
            
    int nd=1;
            
    int i,ng,nt;
            
    for(nt=1,i=0;i<lena;i++)
                nt
    =nt*10;
            
    if (nb != 0)
            
    {
                
    for(nd=i=0;b[i];i++)
                    nd
    =nd*10+9;
                na
    =na*nd+nb;
                nt 
    *= nd;
            }

            ng
    =gcd(na,nt);
            na
    /=ng;
            nt
    /=ng;
            sprintf(buf, 
    "%d/%d", na,nt);
            
    return string(buf);
        }

    }
    ;
    #if 0
    int main()
    {
        
    char *s[]=
        
    {
        
    "0.(0)",//   Returns: "1/3"
        "1.3125",//   Returns: "21/16"
        "2.85(23)",//    Returns: "14119/4950"
        "9.123(456)",//    Returns: "3038111/333000"
        "0.111(1)",//    Returns: "1/9"
        "3.(000)",//    Returns: "3/1"
        0,
        }
    ;
        RecurringNumbers a;
        
    for (int i=0;s[i];i++)
            printf(
    "%s\n", a.convertToFraction(string(s[i])).c_str());
        
        
    return 0;
    }

    #endif
  • 相关阅读:
    java之内部类与匿名内部类
    学习Android之内部类
    Android横竖屏切换总结
    java实现快速排序
    Palindrome Partitioning II
    Palindrome Partitioning
    Clone Graph
    Word Break
    Gas Station
    Candy
  • 原文地址:https://www.cnblogs.com/kaikai/p/305220.html
Copyright © 2020-2023  润新知