HDUACM 1717 小数化分数2
第一次看到这个题目,完全没有思路,突感数学知识的欠缺。Google之后,知道了这题的解法。
如果该小数number不是循环小数,这很好办。将number化成整数,再除以扩大的倍数,化简即可。
若number是循环小数,其实也简单。如果数学知识好的应该知道,把一个循环小数化成整数是有规律的。
比如 0.(5) = 5 / 9; (括号里的是循环的部分)
0.(123) = 123 / 999;
0.00(987) = 987 / 99900;
0.12300(345) = 123 / 1000 + 345 / 99900000;
以上数学知识来源于http://www.worldlingo.com/ma/enwiki/zh_cn/Fraction_(mathematics)
到这儿,规律都清楚了吧。那好,下面是我的AC代码。我相信,肯定有其他牛人有更好的解法或精炼的代码,希望也能与我分享。
#include "stdio.h"
#include "string.h"
#include "math.h"
long gcd(long a,long b)
{
if(a % b == 0)
return b;
else
{
return gcd(b,a % b);
}
}
int main()
{
int n,i,j;
char value[14];
int mark,k;
long v1,v2,temp,v3,temp1;
scanf("%d",&n);
while(n --)
{
scanf("%s",value);
v2 = 0;
v1 = 0;
k = 0;
mark = 0;
for(i = 2; value[i] != '\0'; i ++)
{
if(value[i] == '(')
{
i ++;
while(value[i] != ')')
{
v1 = v1 * 10 + value[i] - '0';
mark ++;
i ++;
}
}
else
{
v2 = v2 * 10 + value[i] - '0';
k ++;
}
}
if(v1 == 0)
{
temp1 = pow(10.0,k);
temp = gcd(v2,temp1);
if(temp != v2 * temp1)
{
v2 = v2 / temp;
temp1 = temp1 / temp;
}
printf("%ld/",v2);
printf("%ld\n",temp1);
}
else
{
v3 = 0;
for(j = 0; j < mark; j ++)
{
v3 = v3 * 10 + 9;
}
if(v2 != 0)
{
v2 *= v3;
}
j = i - mark - 4;
while(j --)
{
v3 *= 10;
}
temp = gcd(v1 + v2,v3);
if(temp != (v2 + v1) * v3)
{
v3 = v3 / temp;
v1 = (v1 + v2) / temp;
}
printf("%ld/",v1);
printf("%ld\n",v3);
}
}
}
浙公网安备 33010602011771号