这题是个数学题,就是给一个循环小数,出现循环的部分用"..."给代替了,但是重点是,循环的部分可能是最后一位,也可能是最后两位,三位.....(感觉题意不清,可能是自己英文不好。)然后将他们划成分数,只写出分母最小的分数。还要注意的是,化成的分数都是最简分数。
记得在小学还是初中的时候,看到一本书上教你快速的将无限循环小数化成分数后然后拿到同学面前去炫耀。。。当时很感兴趣,所以就学会了如何转化的方法。
方法很简单,就是将循环小数 乘以10的多少次方再减去它乘以10的另一个次方以达到将无限循环部分约去的目的就行了。
#ifndef HEAD
#include <stdio.h>
#include <vector>
#include <math.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
#include <list>
#include <algorithm>
#include <stack>
#include <map>
using namespace std;
#endif // !HEAD
#ifndef QUADMEMSET
inline void QuadMemSet(void* dst, int iSize, int value)
{
iSize = iSize / 4;
int* newDst = (int*)dst;
#ifdef WIN32
__asm
{
mov edi, dst
mov ecx, iSize
mov eax, value
rep stosd
}
#else
for (int i = 0; i < iSize; i++)
{
newDst[i] = value;
}
#endif
}
#endif
long long gcd(long long a, long long b)
{
long long tmp = max(a, b);
long long tmp1 = min(a, b);
a = tmp;
b = tmp1;
long long c;
do
{
c = a % b;
a = b;
b = c;
} while (c != 0);
return a;
}
int main()
{
#ifdef _DEBUG
freopen("d:\\in.txt", "r", stdin);
#endif
char szBuffer[20];
while (scanf("%s\n", szBuffer) != EOF)
{
if (strlen(szBuffer) == 1 && szBuffer[0] == '0')
{
break;
}
int iall = 0;
int i = 2;
for (; i < strlen(szBuffer); i++)
{
if (szBuffer[i] == '.')
{
break;
}
iall = iall * 10 + szBuffer[i] - '0';
}
i -= 2;
int min1, min2;
min2 = 1000000000;
int tmp =0 ;
int left = iall;
if (left == 0)
{
printf("0/1\n");
continue;
}
for (int l = 1; l <= i;l++)
{
tmp = (int)(pow((double)10, i) - (int)pow((double)10,i - l));
left = iall - (int)(iall / (int)(pow((double)10, l)));
int igcd = gcd(tmp, left);
if (tmp / igcd < min2)
{
min1 = left / igcd;
min2 = tmp / igcd;
}
}
printf("%d/%d\n", min1, min2);
}
return 0;
}