动态规划做得好腻啊!但是前几天的小测试,来了一个动态规划,结果还是搞不出来。换换口味,就去做杭电的题目,结果wa的好久。好不爽啊,HDU1717挺有趣的一个题目,把小数转换成分数。一直错的测试数据是0.000(5)就是前面算出来是0的。
说一下循环小数转换成分数的过程吧,这个在初中的时候有学过。
就是乘一个数然后剪掉循环部分,这个还是来看个例子你就能明白了:
比如
设x=0.32(67) //()里面的表示循环的部分
n=0.32(67)*100 = 32.(67) //100是因为不循环部分有两位。后面的67依旧循环。
m=0.32(67)*10000 = 3267.(67) //10000是32和循环部分加起来有四位。67依旧循环。
接下去就很明了了m - n = x*(10000-100)
x=(m-n)/(10000-100)
算出来以后不要忘记化简,化简其实就是求一下两个数的最大公约数
下面是我的代码
#include<cstring>
#include<cstdio>
int n;
char str[30];
bool tt;
int gcd(int a, int b)
{
if(a == 0) return b;
if(b % a == 0) return a;
else
return gcd(b % a, a);
}
int main()
{
int i, j;
int x, y;
int k, p;
scanf("%d", &n);
while(n--)
{
getchar();
scanf("%s", str);
j = strlen(str); tt = 0;
for(i = 2; i < j; ++i)
{
if(str[i] == '('){
tt = 1;
break;
}
}
if(tt == 0){
x = str[2] - '0'; y = 10;
for(i = 3; i < j; ++i)
x = x * 10 + (str[i] - '0'), y *= 10;
j = gcd(x, y);
printf("%d/%d\n", x / j, y / j);
}
else{
x = 0; k = 1; i = 2;
for( ; str[i] != '('; ++i)
x = x * 10 + (str[i] - '0'), k *= 10;
y = x; p = k;
for(++i; str[i] != ')'; ++i)
y = y * 10 + (str[i] - '0'), p *= 10;
y -= x;
x = p - k;
j = gcd(x, y);
printf("%d/%d\n", y / j, x / j);
}
}
return 0;
}