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
原文地址:https://www.cnblogs.com/kaikai/p/305220.html