直到结束时才去打开看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 *n = 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