http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=29286

题意:给你0.abcdef...形式无限循环小数,abcdef为0到9的整数,不知道循环节是多少,求



所有可能的分数中分母最小的;



资料:循环小数的处理:


#include <iostream>
#include<cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include<map>
#include <algorithm>
#include <set>
using namespace std;
#define MM(a) memset(a,0,sizeof(a))
typedef long long ll;
typedef unsigned long long ULL;
const int mod = 1000000007;
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
long long gcd(long long a, long long b)
{
if (b == 0)
return a;
else return gcd(b, a%b);
}
long long pow_2(long long a, long long b)
{
	long long temp = b, res = 1,p=a;
while (temp)
	{
if (temp & 1)
			res *= p;
		p = p*p;
		temp >>= 1;
	}
return res;
}//其实可以不需要快速幂,,直接对10进行累乘就好
int main()
{
	char s[1000];
while (~scanf("%s", s))
	{
if (s[1] != '.') return 0;
		long long all = 0, i, num = 0, n, ansc,ansz=inf,ansm=inf, temp;
for (i = 2; s[i] != '.'; i++);
		n = i - 2;
for (int j = 2; j <= i - 1; j++)
			all = all * 10 + s[j] - '0';
for (int k = 1; k <= n; k++)
		{
			num = all / (pow_2(10,k));
			long long fenmu = pow_2(10, n) - pow_2(10, n - k);
			long long fenzi = all - num;
			long long c = gcd(fenzi, fenmu);
if (fenmu / c < ansm)
			{
				 ansz = fenzi / c;
				 ansm = fenmu / c;
			}
		}
printf("%lld/%lld\n",ansz, ansm );
	}
return 0;
}